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
def count_common(l1,l2):
l2_copy=list(l2)
counter=0
for i in l1:
if i in l2_copy:
counter+=1
l2_copy.remove(i)
return counter
l1=[1,1,1]
l2=[1,2]
print count_common(l1,l2)
在Python3.x(以及Python2.7发布时)中,可以使用collections.Counter来完成以下操作:
这里有一个使用collections.defaultdict(在Python 2.5和更高版本中提供)的替代方法。它有一个很好的特性,即结果的顺序是确定的(它本质上对应于第二个列表的顺序)。
对于这两种解决方案,输出列表中任何给定元素
x
的出现次数是两个输入列表中x
出现次数的最小值。你的问题不清楚这是否是你想要的行为。SilentGhost、Mark Dickinson和Lo'oris是对的,非常感谢您报告这个问题-我需要列表的公共部分,因此:
a=[1,1,1,2]
b=[1,1,3,3]
结果应为[1,1]
很抱歉在不合适的地方发表评论-我今天已经注册了。
我修改了你的解决方案:
1个
使用集合是最有效的,但是您始终可以执行
r = [i for i in l1 if i in l2]
。相关问题 更多 >
编程相关推荐