给定两个输入列表,如何创建两个输入共用的元素列表?
例如:对于输入[1,2,3,4,5,6]和[3,5,7,9],结果应该是[3,5];输入[‘这个’,‘这’,' n ', ', ']和[‘这个’,‘不’,‘,’,','],结果应该[‘这个’,‘,’]。
参见: 在Python中,如何从两个列表中找到常用词,同时保持词序?(维持秩序) Python -多个列表的交集?(用于计算>= 3个列表之间的交集) 两个包含重复项的列表的交集?(保持重复元素)
给定两个输入列表,如何创建两个输入共用的元素列表?
例如:对于输入[1,2,3,4,5,6]和[3,5,7,9],结果应该是[3,5];输入[‘这个’,‘这’,' n ', ', ']和[‘这个’,‘不’,‘,’,','],结果应该[‘这个’,‘,’]。
参见: 在Python中,如何从两个列表中找到常用词,同时保持词序?(维持秩序) Python -多个列表的交集?(用于计算>= 3个列表之间的交集) 两个包含重复项的列表的交集?(保持重复元素)
当前回答
S.Mark和SilentGhost建议的解决方案通常会告诉您应该如何以Pythonic方式完成,但我认为您也可以从了解为什么您的解决方案不起作用中受益。问题是,一旦找到两个列表中的第一个公共元素,就只返回该元素。您的解决方案可以通过创建一个结果列表并收集该列表中的公共元素来修复:
def common_elements(list1, list2):
result = []
for element in list1:
if element in list2:
result.append(element)
return result
一个使用列表推导式的更简短的版本:
def common_elements(list1, list2):
return [element for element in list1 if element in list2]
然而,正如我所说,这是一种非常低效的方式——Python的内置集类型更高效,因为它们是在C内部实现的。
其他回答
使用发电机:
common = (x for x in list1 if x in list2)
这样做的好处是,即使在使用庞大的列表或其他庞大的可迭代对象时,它也会在常数时间内(几乎立即)返回生成器。
例如,
list1 = list(range(0,10000000))
list2=list(range(1000,20000000))
common = (x for x in list1 if x in list2)
对于list1和list2的这些值,这里的所有其他答案都将花费很长时间。
然后,您可以用
for i in common: print(i)
使用集合交叉,set(list1) & set(list2)
>>> def common_elements(list1, list2):
... return list(set(list1) & set(list2))
...
>>>
>>> common_elements([1,2,3,4,5,6], [3,5,7,9])
[3, 5]
>>>
>>> common_elements(['this','this','n','that'],['this','not','that','that'])
['this', 'that']
>>>
>>>
注意,结果列表可能与原始列表顺序不同。
使用Python的集合交集:
>>> list1 = [1,2,3,4,5,6]
>>> list2 = [3, 5, 7, 9]
>>> list(set(list1).intersection(list2))
[3, 5]
1) Method1 保存list1是字典,然后迭代list2中的每个elem
def findarrayhash(a,b):
h1={k:1 for k in a}
for val in b:
if val in h1:
print("common found",val)
del h1[val]
else:
print("different found",val)
for key in h1.iterkeys():
print ("different found",key)
找到共同和不同的元素:
2) Method2 使用设置
def findarrayset(a,b):
common = set(a)&set(b)
diff=set(a)^set(b)
print list(common)
print list(diff)
前面的答案都可以找到唯一的公共元素,但不能解释列表中重复的项目。如果你想让公共元素在列表中以相同的数字出现,你可以使用下面的一行代码:
l2, common = l2[:], [ e for e in l1 if e in l2 and (l2.pop(l2.index(e)) or True)]
或True部分仅在您希望任何元素求值为False时才需要。