Python - 多个列表的交集?
我正在玩Python,能够找到两个列表的交集:
result = set(a).intersection(b)
现在如果d
是一个包含a
、b
和第三个元素c
的列表,是否有内置的函数可以找到d
里面所有三个列表的交集呢?比如说,
d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
那么结果应该是
[3,4]
6 个回答
12
@user3917838
这个方法简单明了,但需要一些类型转换才能正常工作,并且最终会得到一个列表。它应该像这样:
list(reduce(set.intersection, [set(item) for item in d ]))
其中:
d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
最终的结果是:
[3, 4]
至少在Python 3.4版本中是这样的。
127
set.intersection(*map(set,d))
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。
65
对于2.4版本,你只需要定义一个交集函数。
def intersect(*d):
sets = iter(map(set, d))
result = sets.next()
for s in sets:
result = result.intersection(s)
return result
对于更新版本的Python:
交集方法可以接受任意数量的参数。
result = set(d[0]).intersection(*d[1:])
另外,你可以将第一个集合与它自己进行交集,这样就不用切割列表和复制了:
result = set(d[0]).intersection(*d)
我不太确定哪种方法更有效,感觉这可能取决于d[0]
的大小和列表的大小,除非Python有内置的检查功能,比如在
if s1 is s2:
return s1
交集方法中。
>>> d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
>>> set(d[0]).intersection(*d)
set([3, 4])
>>> set(d[0]).intersection(*d[1:])
set([3, 4])
>>>