在多个列表中找到共同的值

6

我有一些数字列表,想要查找所有列表中都存在的数字。如果可能的话,我不想使用循环。

以下是一个例子:

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] 这样。 - Juan C
正确。所有独特的值,没有重复。 - SSS
2
你所发布的内容正好符合你所寻找的:set(a) & set(b) & set(c),会得到 {3, 4},如果你想要将结果作为列表,可以使用 list(set(a) & set(b) & set(c)) - Juan C
因此,如果给定a、b、c,则此函数将执行set(a)&set(b)&set(c),但在下一次运行中,可能是a、b、c、d、e、f、g、h、i。 在这种情况下,我无法使用该函数,可能需要创建第二个函数来获取9个输入。 我想知道是否有一个函数可以处理可变数量的输入。 - SSS
3
在我看来,这是一个很差的复制品。它有三分之二的篇幅是关于解析一串整数,另外三分之一是关于集合交集的内容。 - President James K. Polk
显示剩余3条评论
3个回答

26
你可以使用 mapset.intersection
>>> 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]

1
哦,谢谢!这解决了我的问题。 - SSS
更快的替代方法:elements_in_all = set(a).intersection(b, c)。如果你有一个列表的列表:elements_in_all = set(lst[0]).intersection(*lst[1:]) - undefined

4

我不确定为什么你想要避免循环,因为这实际上就是你所要求的——循环遍历一个列表的列表并保持唯一值的集合。

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 & y”来生成唯一元素的集合。 - Robur_131
此外,它可以简洁地写成“import operator; reduce(operator.or_, map(set, l))”。 - Robur_131

3
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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接