Uberlappen von 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
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

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.
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

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]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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]
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

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])
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

oder so:

Code: Alles auswählen

>>> a = [1,2,3]
>>> b = [1,3,5]
>>>
>>> print set(a) & set(b)
set([1, 3])
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Sets behalten die Reihenfolge aber nicht bei, von doppelten Elementen ganz zu schweigen.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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.
In specifications, Murphy's Law supersedes Ohm's.
Antworten