可变数量列表的交集

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 为空时会失败。

以上是关于可变数量列表的交集的主要内容,如果未能解决你的问题,请参考以下文章

MySQL上的三表交集

如何计算 php 中未知数量数组的交集?

集合方法 交集差集

Python 集合set()添加删除交集并集集合操作详解

倒排列表求交集算法 包括baeza yates的交集算法

如何找到列表交集?