Seite 1 von 1
Uberlappen von Listen
Verfasst: Montag 24. Mai 2010, 16:58
von Liffi
Ich habe zwei Objekt mit Listen und moechte gucken, ob und wo die Kombination der Listen ueberlappen.
Um mal ein Beispiel zu machen: obj1 hat die folgenden Listen:
obj2 die folgenden:
Ueberlappen wuerde in dem Fall:
Gibt es eine schoene Moeglichkeit das zu erledigen ohne direkt mit for Schleifen ueber alles laufen zu muessen (das wuerde bei ein paar mehr Dimensionen und Werten vermutlich wesentlich zu lange dauern)?
EDIT:: verschoenert
EDIT2:: Die Listenanzahl ist aber _immer_ gleich.
Re: Uberlappen von Listen
Verfasst: Montag 24. Mai 2010, 17:09
von Liffi
Kaum denkt man nochmal in Ruhe darueber nach und findet die richtigen Begriffe fuer google ist alles kein Problem mehr.
Fuer die Loesung ist ja letztlich keine Permutation oder aehnliches von Noeten, was ich zunaechst befuerchtete.
Re: Uberlappen von Listen
Verfasst: Montag 24. Mai 2010, 17:45
von cofi
Funktional:
Code: Alles auswählen
>>> import functools
>>> import operator
>>> a = [1,2,3]
>>> b = [2,3,4]
>>> filter(functools.partial(operator.contains, b), a)
[2, 3]
Re: Uberlappen von Listen
Verfasst: Montag 24. Mai 2010, 17:50
von HerrHagen
In Python gibt es auch eine spezielle Datenstruktur dafür:
Code: Alles auswählen
>>> a = set([1,2,3])
... b = set([1,2])
... print a.intersection(b)
set([1, 2])
Re: Uberlappen von Listen
Verfasst: Montag 24. Mai 2010, 18:11
von pillmuncher
oder so:
Code: Alles auswählen
>>> a = [1,2,3]
>>> b = [1,3,5]
>>>
>>> print set(a) & set(b)
set([1, 3])
Re: Uberlappen von Listen
Verfasst: Montag 24. Mai 2010, 18:27
von cofi
Sets behalten die Reihenfolge aber nicht bei, von doppelten Elementen ganz zu schweigen.
Re: Uberlappen von Listen
Verfasst: Montag 24. Mai 2010, 20:50
von pillmuncher
cofi hat geschrieben:Sets behalten die Reihenfolge aber nicht bei, von doppelten Elementen ganz zu schweigen.
Stimmt schon. Aber man müsste erst genauer klären, was mit "überlappen" gemeint ist. Selbst, wenn man es expliziert als "alle gemeinsamen Elemente beider Listen in der Reihenfolge ihres Auftretens" kann es in die Hose gehen, sofern man nicht auch die Abfrage-Reihenfolge spezifiziert:
Code: Alles auswählen
>>> a = [1,2,3]
>>> b = [5,3,1]
>>> [x for x in a if x in b]
[1, 3]
>>> [x for x in b if x in a]
[3, 1]
Siehe dazu auch meine sig.

Und auf dem c2wiki
Teach Me To Smoke.