Мы можем использовать Counter
, найденный в стандартной библиотеке Python.
Счетчик подсчитывает, сколько раз элемент был найден в итерируемом. Построение его из списка, по сути, дает карту для каждого элемента в списке по количеству вхождений.
Выполнение пересечения множества на двух счетчиках даст нам количество элементов, найденных в обоих списках. Однако вместо того, чтобы находить количество дубликатов, мы ищем, сколько раз элемент соответствует другому элементу. Это означает, что нам нужно использовать умножение вместо минимума для пересечения множества.
from collections import Counter
def merge(d1, d2):
return {k: (d1[k], d2[k]) for k in d1 if k in d2}
def num_dups(l1, l2):
c1, c2 = Counter(l1), Counter(l2)
dups = merge(c1, c2)
return sum(x * y for x, y in dups.values())