Skip to main content
 首页 » 编程设计

Python 列表减法操作*尊重重复*

2025年05月04日15Renyi-Fan

我希望从另一个列表中减去一个列表,但要尊重重复:

>>> a = ['a', 'b', 'c','c', 'c', 'c', 'd', 'e', 'e'] 
>>> b = ['a', 'c', 'e', 'f','c'] 
>>> a - b 
['b', 'c','c', 'd', 'e'] 

元素的顺序无关紧要。

有问题有答案here但它忽略了重复。那里的解决方案将提供:

>>> a - b 
['b', 'd'] 

一个解决方案考虑了重复但它改变了原始列表之一:

[i for i in a if not i in b or b.remove(i)] 

我写了这个解决方案:

a_sub_b = list(a) 
b_sub_a = list(b) 
for e in a: 
    if e in b_sub_a: 
        a_sub_b.remove(e) 
        b_sub_a.remove(e) 
 
print a_sub_b # a - b  
print b_sub_a # b - a 

这对我有用,但是否有更好的解决方案,更简单或更有效?

请您参考如下方法:

如果顺序无关紧要,请使用 collections.Counter :

c = list((Counter(a) - Counter(b)).elements()) 

Counter(a) - Counter(b) 构建一个计数器,其中元素 x 的计数等于 x 的次数出现在 a 中的次数减去 x 出现在 b 中的次数。 elements() 创建一个迭代器,该迭代器生成每个元素的次数等于其计数,list 将其转换为列表。整个过程需要 O(len(a)+len(b)) 时间。

请注意,根据您的操作,最好不要使用列表,而只保留 a、b 和 c 表示为计数器。