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:

Code: Alles auswählen

1:['a', 'b', 'c'], 2:[1, 3, 7], 3:[1.0, 2.0, 3.0]
obj2 die folgenden:

Code: Alles auswählen

1:['a', 'b', 'c'], 2:[1, 3], 3:[3.0, 7.5, 20]
Ueberlappen wuerde in dem Fall:

Code: Alles auswählen

['a', 'b', 'c'] [1, 3], [3.0]
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.

Code: Alles auswählen

ab = [x for x in a if x in b]

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. 8) Und auf dem c2wiki Teach Me To Smoke.