【问题标题】:Find common values in multiple lists [duplicate]在多个列表中查找共同值[重复]
【发布时间】:2019-07-25 22:12:24
【问题描述】:

所以我有数字列表,我想找到所有列表中存在的数字。如果可能,我不喜欢使用循环。

这是一个例子

a = [1, 2, 3, 4]
b = [2, 3, 4, 5, 6]
c = [3, 4, 5, 6, 10, 12]
df['A'] = [a, b, c]

预计输出为

[3, 4]

我的问题是,列表的数量没有给出,也没有固定。它可以是大约 20 个不同长度的列表(例如 [a, b, c, d, e, g, ..., l])

我已经看到了使用 set(a) & set(b) & set(c) 的答案,但我不确定如何在我的情况下应用它。

【问题讨论】:

  • 您的列表是否始终具有唯一值?例如它永远不会像[1,2,2,3]
  • 对。所有不重复的唯一值
  • 好吧,你发布的内容正是你要找的东西:set(a) & set(b) & set(c),带来了{3, 4},如果你想要你的结果作为一个列表,你可以做list(set(a) & set(b) & set(c))
  • 好吧,set() 的数量会有所不同。每次我运行脚本时,它可能是 2、20、30。
  • 在我看来,这是一个糟糕的骗局。解析一串整数是 2/3,集合交集是 1/3。

标签: python list


【解决方案1】:

您可以将 mapset.<b>intersection</b> 一起使用:

>>> a = [1, 2, 3, 4]
>>> b = [2, 3, 4, 5, 6]
>>> c = [3, 4, 5, 6, 10, 12]
>>> elements_in_all = list(set.intersection(*map(set, [a, b, c])))
>>> elements_in_all
[3, 4]

【讨论】:

  • 哦,谢谢!这解决了我的问题。
【解决方案2】:
In [29]: a = [1, 2, 3, 4] 
    ...: b = [2, 3, 4, 5, 6] 
    ...: c = [3, 4, 5, 6, 10, 12]                                                                                                                                                                                                                                                                                             

In [31]: a, b, c = map(set, (a,b,c))                                                                                                                                                                                                                                                                                          

In [32]: a.intersection(b,c)                                                                                                                                                                                                                                                                                                  
Out[32]: {3, 4}

【讨论】:

    【解决方案3】:

    我不确定您为什么要避免循环,因为这正是您所要求的 - 循环列表列表并保留一组唯一值。

    l = [a, b, c]
    s = None
    
    for e in l:
      if not s:
        s = set(e)
      else:
        s &= set(e)
    
    s => set([3, 4])
    

    您还可以创建一个不显式使用循环的函数式版本,并且仍然支持任意数量的参数:

    reduce((lambda x,y: x & y), map(set, l))
    

    首先,将包含列表 l 中的每个列表转换为一个集合,然后使用 reduce 对包含的每个元素应用交集 - 结果是一个集合,其中包含所有列表共有的元素。

    【讨论】:

    • reduce 功能不错!我们也可以使用x | y而不是x &amp; y来生成唯一元素集,
    • 也可以简写为import operator; reduce(operator.or_, map(set, l))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2022-06-16
    • 2017-09-14
    • 2019-03-21
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多