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

时间:2013-09-02 20:02:35

标签: python performance algorithm

基本上我想要的是:

>>> 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"]

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

的权重就越大

3 个答案:

答案 0 :(得分:9)

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

from collections import Counter

acount = Counter(a)
bcount = Counter(b)
result = list((acount - bcount).elements())

演示:

>>> 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']

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

答案 1 :(得分:0)

您需要做的就是迭代b的每个元素并将其从。

中删除

答案 2 :(得分:0)

不使用多重集,您可以迭代b的元素并从中删除。 Remove仅删除元素的单个实例,而不是所有等效元素的实例。你可以简洁地使用map。

result = a[:] #copy a
map(result.remove, b) #remove elements of b from a