-1

我在 python 中有几个列表,我想只取每个列表中的值,有没有直接做的函数?

例如我有:

{'a','b','c','d','e'},{'a','g','c','d','h','e'}, {'i','b','m','d','e','a'}

我想列出一个包含

{'a','d','e'}

但我不知道我实际上有多少个列表,因为它取决于值“i”。

谢谢你的帮助!

4

4 回答 4

5

如果元素是唯一且可散列的(并且结果中的顺序无关紧要),则可以使用集合交集:例如:

 common_elements = list(set(list1).intersection(list2).intersection(list3))

这在功能上等同于:

 common_elements = list( set(list1) & set(list2) & set(list3) )

&运算符仅适用于集合,而该方法intersection适用于任何可迭代对象。

如果您有一个列表列表并且想要所有列表的交集,您可以轻松地做到这一点:

 common_elements = list( set.intersection( * map(set, your_list_of_lists) ) )

特别感谢帝斯曼指出这一点

或者你可以只使用一个循环:

 common_elements = set(your_list_of_lists[0])
 for elem in your_list_of_lists[1:]:
     common_elements = common_elements.intersection(elem)  #or common_elements &= set(elem) ...
 else:
     common_elements = list(common_elements)

请注意,如果您真的想获得它们在原始列表中的顺序,您可以使用简单的排序来做到这一点:

common_elements.sort( key = lambda x, your_list_of_lists[0].index(x) )

ValueError通过施工,这里没有饲养的风险。

于 2012-08-23T11:49:03.097 回答
3

只是在桌子上放一个衬里:

l=['a','b','c','d','e'],['a','g','c','d','h'], ['i','b','m','d','e']  
reduce(lambda a, b: a & b, map(set, l))  

或者

from operator import and_
l=['a','b','c','d','e'],['a','g','c','d','h'], ['i','b','m','d','e']  
reduce(and_, map(set, l))  
于 2012-08-23T11:58:34.697 回答
1

您需要从第一个列表中进行设置,然后使用 set 的.intersection()方法。

a, b, c = ['a','b','c','d','e'], ['a','g','c','d','h'], ['i','b','m','d','e']
exists_in_all = set(a).intersection(b).intersection(c)

更新。 根据mgilson的评论进行了简化。

于 2012-08-23T11:52:15.527 回答
0
from operator import and_

import operator
a = [['a','b','c','d','e'],['a','g','c','d','h','e'], ['i','b','m','d','e','a']]
print list(reduce(operator.and_, map(set, a)))

它会给你列表中的 commeen 元素

['a', 'e', 'd']
于 2012-08-23T13:50:54.577 回答