取python中任意数量的列表的交集

时间:2010-05-23 21:19:19

标签: python algorithm list intersection

假设我有一个完全相同的元素列表列表(在本例中我将使用int

[range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]

获取这些列表的交集是一种很好的和/或有效的方法(这样你就可以获得每个列表中的每个元素)? 对于以下示例:

[0, 12, 24, 36, 48, 60, 72, 84, 96]

7 个答案:

答案 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更大的数据集更快。