在Python中取多个列表的交集
假设我有一个包含多个列表的列表,这些列表里的元素都是一样的(在这个例子中,我会用 int
整数来表示)。
[range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
那么,有什么好的或者高效的方法可以找出这些列表的交集呢?也就是说,找出每个列表都有的元素。对于这个例子,结果会是:
[0, 12, 24, 36, 48, 60, 72, 84, 96]
7 个回答
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
是一种函数式编程的工具,它会遍历任何可以迭代的对象,并把你提供的函数应用到前两个元素上,然后把结果和下一个元素一起处理,再把这个结果和下一个元素继续处理,依此类推。
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]
9
使用集合,它们有一个交集的方法。
>>> 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])