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?

17voto

arekolek Punkte 8052

Ich wollte etwas, das zwei Listen aufnehmen kann und was diff in bash tut. Da diese Frage zuerst auftaucht, wenn Sie nach "Python diff zwei Listen" suchen und nicht sehr spezifisch ist, werde ich posten, was ich herausgefunden habe.

Verwendung von SequenceMather de difflib können Sie zwei Listen vergleichen wie diff tut. Keine der anderen Antworten gibt die Position an, an der der Unterschied auftritt, diese aber schon. Einige Antworten geben die Differenz nur in einer Richtung an. Einige ordnen die Elemente neu an. Einige behandeln keine Duplikate. Aber diese Lösung gibt Ihnen eine echte Differenz zwischen zwei Listen:

a = 'A quick fox jumps the lazy dog'.split()
b = 'A quick brown mouse jumps over the dog'.split()

from difflib import SequenceMatcher

for tag, i, j, k, l in SequenceMatcher(None, a, b).get_opcodes():
  if tag == 'equal': print('both have', a[i:j])
  if tag in ('delete', 'replace'): print('  1st has', a[i:j])
  if tag in ('insert', 'replace'): print('  2nd has', b[k:l])

Diese Ausgaben:

both have ['A', 'quick']
  1st has ['fox']
  2nd has ['brown', 'mouse']
both have ['jumps']
  2nd has ['over']
both have ['the']
  1st has ['lazy']
both have ['dog']

Natürlich werden Sie am meisten davon profitieren, wenn Ihre Bewerbung die gleichen Annahmen wie die anderen Antworten enthält. Aber wenn Sie nach einer echten diff Funktionalität, dann ist dies der einzige Weg, den wir gehen können.

Zum Beispiel konnte keine der anderen Antworten damit umgehen:

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

Aber dieser hier schon:

  2nd has [5, 4, 3, 2]
both have [1]
  1st has [2, 3, 4, 5]

16voto

Taylor D. Edmiston Punkte 10409

Hier ist ein Counter Antwort für den einfachsten Fall.

Dies ist kürzer als das obige Beispiel, das einen zweiseitigen Vergleich durchführt, weil es nur genau das tut, was die Frage verlangt: eine Liste der Elemente der ersten Liste, aber nicht der zweiten, zu erstellen.

from collections import Counter

lst1 = ['One', 'Two', 'Three', 'Four']
lst2 = ['One', 'Two']

c1 = Counter(lst1)
c2 = Counter(lst2)
diff = list((c1 - c2).elements())

Je nachdem, wie Sie es mit der Lesbarkeit halten, eignet es sich aber auch für einen guten Einzeiler:

diff = list((Counter(lst1) - Counter(lst2)).elements())

Salida:

['Three', 'Four']

Beachten Sie, dass Sie die list(...) aufrufen, wenn Sie nur darüber iterieren.

Da diese Lösung mit Zählern arbeitet, kann sie Mengen im Vergleich zu den vielen mengenbasierten Antworten richtig handhaben. Zum Beispiel bei dieser Eingabe:

lst1 = ['One', 'Two', 'Two', 'Two', 'Three', 'Three', 'Four']
lst2 = ['One', 'Two']

Die Ausgabe ist:

['Two', 'Two', 'Three', 'Three', 'Four']

13voto

Mohammed Punkte 111

Dies könnte sogar schneller sein als das Verständnis der Liste von Mark:

list(itertools.filterfalse(set(temp2).__contains__, temp1))

8voto

sreemanth pulagam Punkte 835

Einzeilige Version von arulmr Lösung

def diff(listA, listB):
    return set(listA) - set(listB) | set(listA) -set(listB)

8voto

Hier ist eine modifizierte Version von @SuperNova's Antwort

def get_diff(a: list, b: list) -> list:
    return list(set(a) ^ set(b))

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