我在python中有几个列表,我想只获取每个列表中的值,是否有任何函数可以直接执行?
例如我有:
{'a','b','c','d','e'},{'a','g','c','d','h','e'}, {'i','b','m','d','e','a'}
我想创建一个包含
的列表{'a','d','e'}
但我不知道我实际拥有多少个列表,因为它依赖于值'i'。
感谢您的帮助!
答案 0 :(得分:5)
如果元素是唯一且可清除的(并且结果中的顺序无关紧要),则可以使用set交集:例如:
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) ) )
特别感谢DSM指出这一点
或者您可以使用循环:
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
被提升的风险。
答案 1 :(得分: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))
答案 2 :(得分:1)
您需要从第一个列表中设置make,然后使用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 的评论简化。
答案 3 :(得分: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)))
它将为您提供列表中的荣誉元素
['a', 'e', 'd']