提问人:roisinncc 提问时间:5/16/2023 最后编辑:Hai Vuroisinncc 更新时间:5/16/2023 访问量:101
如何计算两个列表中的公共元素数量(包括两个列表中的重复 IF)?
How do I count the number of common elements in two lists (including duplicates IF in both lists)?
问:
我想计算两个列表中的公共元素的数量,其中重复项被单独处理(即,如果“a”在一个列表中出现一次,另一个列表中出现两次,则只计算一次,但如果它在两个列表中出现两次,它将被计算为 2)。
x = [1, 2, 3, 4, 5, 5]
y = [1, 2, 5, 6, 7, 8]
此处的公共元素数量为 3。
x = [1, 2, 3, 4, 5, 5]
y = [1, 2, 5, 6, 7, 8, 5]
此处的公共元素数量为 4。
我找到的最接近的命令是
res = sum(i == j for i, j in zip(x, y))
它有效,除非两个列表中有两个相同的元素,否则它只会计算它们一次。
答:
-1赞
Tim Roberts
5/16/2023
#1
这就是我要说的。这是一种“差异”算法。对列表进行排序,然后逐个浏览它们,直到它们变空。
如果列表很长,最好在列表中保留索引,而不是使用 ,但这很简单。.pop(0)
def countdups( l1, l2 ):
l1 = sorted(l1)
l2 = sorted(l2)
dups = 0
while l1 and l2:
if l1[0] == l2[0]:
dups += 1
l1.pop(0)
l2.pop(0)
elif l1[0] < l2[0]:
l1.pop(0)
else:
l2.pop(0)
return dups
x = [1, 2, 3, 4, 5, 5]
y = [1, 2, 5, 6, 7, 8]
print(countdups(x,y))
x = [1, 2, 3, 4, 5, 5]
y = [1, 2, 5, 6, 7, 8, 5]
print(countdups(x,y))
输出:
3
4
2赞
tdelaney
5/16/2023
#2
您可以使用它来计算每个列表中的出现次数。方便的是,它定义的交集行为(运算符)采用每个公共元素的最小值,这正是您想要的操作。假设您是 python 3.10 或更高版本,它也会为您求和collections.Counter
&
import collections
x = [1, 2, 3, 4, 5, 5]
y = [1, 2, 5, 6, 7, 8]
result = (collections.Counter(x) & collections.Counter(y)).total()
print(result)
x = [1, 2, 3, 4, 5, 5]
y = [1, 2, 5, 6, 7, 8, 5]
result = (collections.Counter(x) & collections.Counter(y)).total()
print(result)
评论
0赞
Kelly Bundy
5/16/2023
return (x_count & y_count).total()
0赞
tdelaney
5/16/2023
@KellyBundy - 我不确定类集合操作的定义行为是什么,但从文档中: 交集和联合返回相应计数的最小值和最大值。.所以,是的,这很有效。
评论