假设我有一个相同的元素列表列表(我将int
在本例中使用 s )
[range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
什么是取这些列表的交集的好方法和/或有效的方法(所以你会得到每个列表中的每个元素)?例如:
[0, 12, 24, 36, 48, 60, 72, 84, 96]
假设我有一个相同的元素列表列表(我将int
在本例中使用 s )
[range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
什么是取这些列表的交集的好方法和/或有效的方法(所以你会得到每个列表中的每个元素)?例如:
[0, 12, 24, 36, 48, 60, 72, 84, 96]
使用具有交集方法的集合。
>>> s = set()
>>> s.add(4)
>>> s.add(5)
>>> s
set([4, 5])
>>> t = set([2, 4, 9])
>>> s.intersection(t)
set([4])
对于您的示例,类似
>>> data = [range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
>>> sets = map(set, data)
>>> print set.intersection(*sets)
set([0, 96, 36, 72, 12, 48, 84, 24, 60])
我认为内置set
模块应该可以解决问题。
>>> elements = [range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
>>> sets = map(set, elements)
>>> result = list(reduce(lambda x, y: x & y, sets))
>>> print result
[0, 96, 36, 72, 12, 48, 84, 24, 60]
将它们转换为集合并使用该set.intersection
方法,减少集合列表:
xs = [range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
reduce(set.intersection, [set(x) for x in xs])
reduce
是一种函数式编程设备,它遍历任何可迭代对象并将提供的函数应用于前两个元素,然后应用于结果和下一个元素,然后是那个和下一个元素的结果,依此类推。
我要回答我自己的问题:
lists = [range(100)[::4],range(100)[::3],range(100)[::2],range(100)[::1]]
out = set(lists[0])
for l in lists[1:]:
out = set(l).intersection(out)
print out
或者
print list(out)
这是使用良好的旧all()
内置函数的单线:
list(num for num in data[0]
if all(num in range_ for range_ in data[1:]))
有趣的是,这(我认为)比使用更大的数据集更具可读性和速度。set
您可以将它们视为集合并使用set.intersection()
:
lists = [range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
sets = [set(l) for l in lists]
isect = reduce(lambda x,y: x.intersection(y), sets)
l = [range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
l = [set(i) for i in l]
intersect = l[0].intersection(l[1])
for i in l[2:]:
intersect = intersect.intersection(i)