可变数量列表的交集
Posted
技术标签:
【中文标题】可变数量列表的交集【英文标题】:Intersection of variable number of lists 【发布时间】:2012-06-07 08:11:51 【问题描述】:我定义两个列表的交集如下:
def intersect(a, b):
return list(set(a) & set(b))
对于三个参数,它看起来像:
def intersect(a, b, c):
return (list(set(a) & set(b) & set(c))
我可以将这个函数推广到可变数量的列表吗?
调用将如下所示:
>> intersect([1, 2, 2], [2, 3, 2], [2, 5, 2], [2, 7, 2])
[2]
编辑:Python 只能这样实现?
intersect([
[1, 2, 2], [2, 3, 2], [2, 5, 2], [2, 7, 2]
])
[2]
【问题讨论】:
how best do I find the intersection of multiple sets in python? 的可能重复项 Python -Intersection of multiple lists?的可能重复 为什么这被赞成了?这是一个完全相同的副本。 @jamylak 我的问题不同。我想扩展我的函数以获得更多参数(未知数量的参数)。 @jamylak 好的,我没有意识到这一点。真的很像。 【参考方案1】:def intersect(*lists):
if(len(lists) <=1):
return lists[0]
result = lists[0]
for i in range(1, len(lists)):
result = set(result) & set(lists[i])
return list(result)
像这样调用函数...
intersect([1,2],[2,3],[2,4])
把所有的卫生都交给你。
【讨论】:
谢谢。我也喜欢这个解决方案。 它不是很 Pythonic,在 Python 中永远不需要使用索引来迭代列表。【参考方案2】:使用*
-list-to-argument operator 而不是您的自定义函数使用set.intersection
:
>>> lists = [[1, 2, 2], [2, 3, 2], [2, 5, 2], [2, 7, 2]]
>>> list(set.intersection(*map(set, lists)))
[2]
如果你想在函数中使用 list-to-set-to-list 逻辑,你可以这样做:
def intersect(lists):
return list(set.intersection(*map(set, lists)))
如果您更喜欢 intersect()
接受任意数量的参数而不是单个参数,请改用它:
def intersect(*lists):
return list(set.intersection(*map(set, lists)))
【讨论】:
您实际上不需要设置每个列表,只有第一个 -set(lists[0]).intersection(*lists)
会做同样的事情。并不是说这一定是一个好主意,因为它的可读性稍差,但对于大量列表来说,它可能会更有效。
@ThiefMaster Python 只能将参数作为列表?它不能接受可变数量的参数吗?
@xralf:如果您希望intersect()
接受多个参数,请使用def intersect(*lists)
。那么lists
将是一个包含所有位置参数的列表。
这不是一个好的解决方案。当lists
为空时会失败。以上是关于可变数量列表的交集的主要内容,如果未能解决你的问题,请参考以下文章