因此,我有数字列表,我想找到所有列表中都存在的数字。我宁愿不要使用循环。
这里是一个例子
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)的答案,但是我不确定如何在我的情况下应用它。
答案 0 :(得分:3)
您可以使用地图和set.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 :(得分:1)
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}
答案 2 :(得分:1)
我不确定您为什么要避免循环,因为这确实是您要的-遍历列表列表并保留唯一值集。
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对所包含的每个元素应用交集-结果是所有列表共有元素的单个集合。