Skip to main content
 首页 » 编程设计

具有可能重复值的两个列表之间的 Python 差异

2025年05月04日15itcoder

我有两个列表,每个列表都有非唯一的数字,这意味着它们可以多次具有相同的值。

我需要找到两者之间的区别,因为相同的值可能会出现多次(所以我无法区分每个集合之间的区别)。因此,我需要检查某个值在第一个列表中出现的次数是否多于第二个。

列表是:

l1 = [1, 2, 5, 3, 3, 4, 9, 8, 2] 
l2 = [1, 1, 3, 2, 4, 8, 9] 
 
# Sorted and justified 
l1 = [1,    2, 2, 3, 3, 4, 5, 8, 9] 
l2 = [1, 1, 2,    3,    4,    8, 9] 

列表元素可以是字符串或整数或 float 。 所以结果列表应该是:

difference(l1, l2) == [3, 5, 2]  
# There is an extra 2 and 3 in l1 that is not in l2, and a 5 in l1 but not l2.  
 
difference(l2, l1) == [1] 
# The extra 1 is the only value in l2 but not in l1. 

我已经尝试过列表理解[x for x in l1 if x not in l2] 但这不起作用,因为它没有考虑到两者中的重复值。

请您参考如下方法:

如果顺序不重要,您可以使用计数器(参见标准库的collections 模块):

from collections import Counter 
 
l1 = [1,2,5,3,3,4,9,8,2] 
l2 = [1,1,3,2,4,8,9] 
 
c1 = Counter(l1) # Counter({2: 2, 3: 2, 1: 1, 5: 1, 4: 1, 9: 1, 8: 1}) 
c2 = Counter(l2) # Counter({1: 2, 3: 1, 2: 1, 4: 1, 8: 1, 9: 1}) 
 
diff1 = list((c1-c2).keys()) # [2, 5, 3] 
diff2 = list((c2-c1).keys()) # [1] 

这是相当通用的,也适用于字符串:

... 
l1 = ['foo', 'foo', 'bar'] 
l2 = ['foo', 'bar', 'bar', 'baz'] 
... 
# diff1 == ['foo'] 
# diff2 == ['bar', 'baz']