假设我有一个完全相同的元素列表列表(在本例中我将使用int
)
[range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
获取这些列表的交集是一种很好的和/或有效的方法(这样你就可以获得每个列表中的每个元素)? 对于以下示例:
[0, 12, 24, 36, 48, 60, 72, 84, 96]
答案 0 :(得分:7)
使用具有交集方法的集合。
>>> 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])
答案 1 :(得分:4)
我认为内置的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]
答案 2 :(得分:3)
将它们转换为集合并使用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
是一个函数式编程设备,它遍历任何iterable并将提供的函数应用于前两个元素,然后应用于结果和下一个元素,然后是的结果和下一个,等等。
答案 3 :(得分:1)
我要回答我自己的问题:
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)
答案 4 :(得分:0)
您可以将它们视为集合并使用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)
答案 5 :(得分:0)
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)
答案 6 :(得分:0)
这是一个使用旧的all()
内置函数的单线程:
list(num for num in data[0]
if all(num in range_ for range_ in data[1:]))
有趣的是,这比(我认为)更容易阅读和比使用set
更大的数据集更快。