Seite 1 von 1

Vergleich von 2 Listen

Verfasst: Mittwoch 18. Februar 2009, 11:33
von tgooper
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

Verfasst: Mittwoch 18. Februar 2009, 11:42
von ms4py
z.B.:

Code: Alles auswählen

if checklist[x] in neulist:
  print "from neulist"
else:
  print "from altlist"

Verfasst: Mittwoch 18. Februar 2009, 11:51
von CM
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:

Verfasst: Mittwoch 18. Februar 2009, 13:49
von BlackJack
Wobei `neulist` eventuell besser ein `set()` sein sollte, damit der Test nicht lineare Laufzeit hat.

Verfasst: Mittwoch 18. Februar 2009, 14:15
von CM
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

Verfasst: Mittwoch 18. Februar 2009, 14:34
von Leonidas
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.

Verfasst: Mittwoch 18. Februar 2009, 14:37
von 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.

Verfasst: Mittwoch 18. Februar 2009, 14:41
von CM
Ok, danke. Die lambda-Funktion ist natürlich rel. ineffizient - das hatte ich übersehen.

Verfasst: Mittwoch 18. Februar 2009, 15:28
von tgooper
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

Verfasst: Mittwoch 18. Februar 2009, 16:29
von helduel
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.