Vergleich von 2 Listen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tgooper
User
Beiträge: 24
Registriert: Mittwoch 8. Februar 2006, 09:12

Hallo,

ich vergleiche mittels

Code: Alles auswählen

 checklist =  list(set(neulist) ^ set(altlist))
2 Listen. In der "checkliste" wird pro Differenz ein Eintrag gemacht.
Wie kann ich feststellen aus welcher Liste der Eintrag kommt??

Thanx
Tgooper
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

z.B.:

Code: Alles auswählen

if checklist[x] in neulist:
  print "from neulist"
else:
  print "from altlist"
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

oder

Code: Alles auswählen

In [13]: inneulist = lambda item: item in neulist

In [14]: [inneulist(item) for item in checklist]
Out[14]: [True, False]
:wink:

edit PS:
Dem ging natürlich voraus:

Code: Alles auswählen

In [1]: neulist = [1,2,3]

In [2]: altlist = [2,3,4]
und Deine Codezeile .. :oops:
BlackJack

Wobei `neulist` eventuell besser ein `set()` sein sollte, damit der Test nicht lineare Laufzeit hat.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Das verstehe ich nicht: Den ganzen Aufwand (Umwandlung in set, dann wieder in list) macht man doch nur, wenn hier und dort im Code Reihenfolge wichtig ist. Sonst könnte ja nur mit sets gearbeitet werden und es wäre auch entsprechend einfach die Frage von tgooper zu beantworten, da das schon in den sets eingebaut ist. Oder übersehe ich etwas BJ?

Danke,
Christian
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Es geht ja nur um ``neulist``. Wenn das eine Liste ist, hat ``inneulist`` lineare Laufzeit. Wenn du das in einer LC verwendest, hast du gleich mal quadratische Laufzeit (genauer O(m*n)). Wenn ``neulist`` ein Set wäre, dann wäre ``in`` keine Operation mit linearer Laufzeit sondern... ähm, sublinearer Laufzeit (ich bin nicht sicher ob konstant) und damit verbessert sich das Zeitverhalten immens, weil du nicht mehr für jedes Element von ``checklist`` alle Elemente von ``neulist`` durchgehen musst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@CM: Es kommt darauf an von wievielen Elementen aus `checklist` man am Ende wissen möchte aus welcher Liste sie kommen. Das `inneulist()` ist halt ineffizient. Das `set()` muss ja nicht `neulist` heissen, man kann dieses Zwischenergebnis, das man in der ursprünglichen Zeile von `tgooper` sowieso erstellt, ja an einen temporären Namen binden.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Ok, danke. Die lambda-Funktion ist natürlich rel. ineffizient - das hatte ich übersehen.
tgooper
User
Beiträge: 24
Registriert: Mittwoch 8. Februar 2006, 09:12

Besten Dank für die vielen Antworten und die Diskussion über die Laufzeit. Ich habe jetzt die Lösung von 'ice2k3' eingebaut, da diese für mich als Python Anfänger die verständlichere Variante ist.

Thanx
Tgooper
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Wie wäre es mit sowas:

Code: Alles auswählen

s1 = set([1,2,3,4])
s2 = set([2,3,5,6])

result1 = s1 - s2
result2 = s2 - s1
So weißt du gleich welches Element aus welchem set kommt.
Antworten