在python中获取N-many列表的最简单方法是什么?
如果我有两个列表a和b,我知道我可以这样做:
a = set(a)
b = set(b)
intersect = a.intersection(b)
但我想做一些像& amp; b& c& d& ...对于任意一组列表(理想情况下,不首先转换为集合,但如果这是最简单/最有效的方式,我可以处理它。)
即。我想编写一个函数intersect(* args),它可以有效地为任意多个集合执行。最简单的方法是什么?
编辑:我自己的解决方案是减少(set.intersection,[a,b,c]) - 这样好吗?
感谢。
答案 0 :(得分:13)
这适用于1个或多个列表。 0列表的情况并不那么容易,因为它必须返回一个包含所有可能值的集合。
def intersection(first, *others):
return set(first).intersection(*others)
答案 1 :(得分:2)
这适用于1个或多个列表,不使用多个参数:
>>> def intersection(*listas):
... return set(listas[0]).intersection(*listas[1:])
...
>>> intersection([1,2,3,4],[4,5,6],[2,4,5],[1,4,8])
set([4])
>>> intersection([1,2,3,4])
set([1, 2, 3, 4])
>>>
无论如何,不确定这比其他答案更好。
答案 2 :(得分:2)
lists = [[5,4,3], [4,2], [6,2,3,4]]
try:
# the following line makes one intersection too much, but I don't think
# this hurts performance noticably.
intersected = set(lists[0]).intersection(*lists)
except ValueError:
# no lists[0]
intersected = set()
print intersected # set([4])
集合可以与任何迭代相交,不需要先将它转换为集合。