1260 Stimmen

Unterschied zwischen zwei Listen ermitteln

Ich habe zwei Listen in Python:

temp1 = ['One', 'Two', 'Three', 'Four']
temp2 = ['One', 'Two']

Ich möchte eine dritte Liste mit Elementen aus der ersten Liste erstellen, die nicht in der zweiten Liste enthalten sind:

temp3 = ['Three', 'Four']

Gibt es einen schnellen Weg ohne Zyklen und Kontrollen?

1810voto

ars Punkte 112843

Um Elemente zu erhalten, die sich in temp1 aber nicht in temp2 :

In [5]: list(set(temp1) - set(temp2))
Out[5]: ['Four', 'Three']

Beachten Sie, dass sie asymmetrisch ist:

In [5]: set([1, 2]) - set([2, 3])
Out[5]: set([1]) 

wo man erwarten/erwünschen könnte, dass es gleich ist set([1, 3]) . Wenn Sie wollen set([1, 3]) als Ihre Antwort, können Sie verwenden set([1, 2]).symmetric_difference(set([2, 3])) .

657voto

Mark Byers Punkte 761508

Die bestehenden Lösungen bieten alle entweder das eine oder das andere an:

  • Schneller als O(n*m) Leistung.
  • Reihenfolge der Eingabeliste beibehalten.

Aber bis jetzt hat keine der beiden Lösungen funktioniert. Wenn Sie beides wollen, versuchen Sie dies:

s = set(temp2)
temp3 = [x for x in temp1 if x not in s]

Leistungstest

import timeit
init = 'temp1 = list(range(100)); temp2 = [i * 2 for i in range(50)]'
print timeit.timeit('list(set(temp1) - set(temp2))', init, number = 100000)
print timeit.timeit('s = set(temp2);[x for x in temp1 if x not in s]', init, number = 100000)
print timeit.timeit('[item for item in temp1 if item not in temp2]', init, number = 100000)

Ergebnisse:

4.34620224079 # ars' answer
4.2770634955  # This answer
30.7715615392 # matt b's answer

Die von mir vorgestellte Methode bewahrt nicht nur die Reihenfolge, sondern ist auch (etwas) schneller als die Subtraktion von Mengen, da keine unnötige Menge gebildet werden muss. Der Leistungsunterschied würde sich stärker bemerkbar machen, wenn die erste Liste wesentlich länger ist als die zweite und wenn das Hashing teuer ist. Hier ist ein zweiter Test, der dies demonstriert:

init = '''
temp1 = [str(i) for i in range(100000)]
temp2 = [str(i * 2) for i in range(50)]
'''

Ergebnisse:

11.3836875916 # ars' answer
3.63890368748 # this answer (3 times faster!)
37.7445402279 # matt b's answer

272voto

SuperNova Punkte 20412

Kann mit dem Python XOR-Operator durchgeführt werden.

  • Dadurch werden die Duplikate in jeder Liste entfernt
  • Dies zeigt die Differenz von temp1 zu temp2 und temp2 zu temp1.

set(temp1) ^ set(temp2)

141voto

matt b Punkte 135206

Sie könnten das Listenverständnis verwenden:

temp3 = [item for item in temp1 if item not in temp2]

32voto

Maciej Kucharz Punkte 1275

Versuchen Sie dies:

temp3 = set(temp1) - set(temp2)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X