2013-09-02 2 views
0

В основном то, что я хочу это:Удалить элементы одного списка с другой, сохраняя при этом дубликаты

>>> 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 (потому что у большего количества списков есть этот элемент), тем больше веса я ставлю на это

+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() генерирует последовательность элементов, умноженную на их количество, чтобы снова получить желаемый результат.

+0

Работает потрясающе !! – barrigaj

0

Все, что вам нужно сделать, это перебрать каждый элемент b и удалить его из.

0

Не используя мультимножества, вы можете перебирать элементы b и удалять из. Удалить удаляет только один экземпляр элемента, а не все экземпляры эквивалентных элементов. Вы можете сделать это в сжатом виде с помощью карты.

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

Простой 'a [:]' будет делать, чтобы создать копию. Обратите внимание, что '.remove()' должен каждый раз проверять «результат», поэтому это решение «O (NM)»; поскольку 'a' и' b' увеличивают время, чтобы завершить ваш алгоритм, растет экспоненциально. –

Смежные вопросы