从另一个列表中删除一个列表的元素,同时保留重复项

bar*_*gaj 0 python algorithm performance

基本上我想要的是这个:

>>> a = ["a","a","b","c","c","c","d","e","f"]
>>> b = ["a","b","c","d","e","f"]
>>> #Do something, something like a - b
>>> result = ["a","c","c"]
Run Code Online (Sandbox Code Playgroud)

我想这样做的原因,我正在加入一系列偏好列表,并希望找到哪一个在很多列表中很常见.它们出现在列表a中的次数越多(因为更多列表具有该元素),我就越重视它

Mar*_*ers 9

你正在寻找多重集合.使用collections.Counter(),multiset的Python实现:

from collections import Counter

acount = Counter(a)
bcount = Counter(b)
result = list((acount - bcount).elements())
Run Code Online (Sandbox Code Playgroud)

演示:

>>> from collections import Counter
>>> a = ['a', 'a', 'b', 'c', 'c', 'c', 'd', 'e', 'f']
>>> b = ['a', 'b', 'c', 'd', 'e', 'f']
>>> Counter(a) - Counter(b)
Counter({'c': 2, 'a': 1})
>>> list((Counter(a) - Counter(b)).elements())
['a', 'c', 'c']
Run Code Online (Sandbox Code Playgroud)

Counter()但是,您可能希望保留实例; 但是如果你需要它,该Counter.elements()方法会生成一系列元素乘以其计数,以再次产生所需的输出.