如何计算两个列表中的公共元素数量(包括两个列表中的重复 IF)?

How do I count the number of common elements in two lists (including duplicates IF in both lists)?

提问人:roisinncc 提问时间:5/16/2023 最后编辑:Hai Vuroisinncc 更新时间:5/16/2023 访问量:101

问:

我想计算两个列表中的公共元素的数量,其中重复项被单独处理(即,如果“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))

它有效,除非两个列表中有两个相同的元素,否则它只会计算它们一次。

python-3.x 列表 python-2.7

评论

1赞 DasaniT 5/16/2023
也许这会有所帮助:stackoverflow.com/a/37645155/8801732

答:

-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 - 我不确定类集合操作的定义行为是什么,但从文档中: 交集和联合返回相应计数的最小值和最大值。.所以,是的,这很有效。