найти не пересечение между 2 списками, включая дубликаты - PullRequest
0 голосов
/ 03 октября 2019

Я пытался найти этот вопрос, прежде чем спрашивать, но не смог найти удовлетворительного. поэтому у меня есть 2 списка, как это

a=[1,2,3,4,4]
b=[1,1,2,3,4]

Я пробовал это:

set(a) - set(b)

, но получил это

set()

что я хочу это

[1,4]

Поскольку множество a имеет 2 4 с, а множество b имеет 2 1 с. Что я могу сделать? Спасибо!

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Использование collection.Counter , это реализация Python для multiset :

from collections import Counter

a = [1, 2, 3, 4, 4]
b = [1, 1, 2, 3, 4]
c = [1, 1, 1, 2, 3, 4]

counts_a = Counter(a)
counts_b = Counter(b)
counts_c = Counter(c)

result_b = (counts_a | counts_b) - (counts_a & counts_b)
result_c = (counts_a | counts_c) - (counts_a & counts_c)

print(list(result_b.elements()))
print(list(result_c.elements()))

Output

[1, 4]
[1, 1, 4]

Обратите внимание, что (counts_a | counts_b) - (counts_a & counts_b) - это эквивалент Python математической формулы.

2 голосов
/ 03 октября 2019

С collections.Counter объектом для сравнения вхождений соответствующих значений:

from collections import Counter

a = [1, 2, 3, 4, 4]
b = [1, 1, 2, 3, 4]
a_counts, b_counts = Counter(a), Counter(b)
res = [a_key for a_key, b_key in zip(a_counts, b_counts)
       if a_counts[a_key] != b_counts[b_key]]

print(res)   # [1, 4]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...