我想要计算两个列表的相同元素.列表可以有重复的元素,因此我无法将其转换为集合并使用&运算符.
a=[2,2,1,1]
b=[1,1,3,3]
Run Code Online (Sandbox Code Playgroud)
设置(a)和设置(b)工作
a和b不起作用
有可能用套装和dictonary吗?
Mar*_*son 11
在Python 3.x(和Python 2.7,当它发布时),你可以使用collections.Counter:
>>> from collections import Counter
>>> list((Counter([2,2,1,1]) & Counter([1,3,3,1])).elements())
[1, 1]
Run Code Online (Sandbox Code Playgroud)
这是使用collections.defaultdict(Python 2.5及更高版本中提供)的替代方法.它具有良好的属性,结果的顺序是确定性的(它基本上对应于第二个列表的顺序).
from collections import defaultdict
def list_intersection(list1, list2):
bag = defaultdict(int)
for elt in list1:
bag[elt] += 1
result = []
for elt in list2:
if elt in bag:
# remove elt from bag, making sure
# that bag counts are kept positive
if bag[elt] == 1:
del bag[elt]
else:
bag[elt] -= 1
result.append(elt)
return result
Run Code Online (Sandbox Code Playgroud)
对于这两种解决方案,x输出列表中任何给定元素的出现次数是x两个输入列表中出现次数的最小值.从您的问题不清楚这是否是您想要的行为.