In Python 3.x (und Python 2.7, wenn es freigegeben wird), können Sie collections.Counter für diesen Einsatz:
>>> from collections import Counter
>>> list((Counter([2,2,1,1]) & Counter([1,3,3,1])).elements())
[1, 1]
Hier ist eine alternative collections.defaultdict (erhältlich in Python 2.5 und höher). Es hat die nette Eigenschaft, dass die Reihenfolge des Ergebnisses deterministisch ist (es entspricht im Wesentlichen der Reihenfolge der zweiten Liste).
from collections import defaultdict
def list_intersection(list1, list2):
bag = defaultdict(int)
for elt in list1:
bag[elt] += 1
result = []
for elt in list2:
if elt in bag:
# remove elt from bag, making sure
# that bag counts are kept positive
if bag[elt] == 1:
del bag[elt]
else:
bag[elt] -= 1
result.append(elt)
return result
für diese beiden Lösungen, die Anzahl des Auftretens eines gegebenen Elements x
in der Ausgabeliste ist das Minimum der Anzahl der Vorkommen von x
in den beiden Eingangslisten. Es ist nicht klar aus deiner Frage, ob dies das gewünschte Verhalten ist.
Warum nicht Sets verwenden möchten? –
Ich habe doppelte Elemente in der Liste – Thomas
Was sind die erwarteten Rückgabewerte für '[1, 2, 1]' und '[1, 3, 2]'? – SilentGhost