Zip von zwei Listen mit Filterung

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
mr-sansibar
User
Beiträge: 4
Registriert: Dienstag 27. Oktober 2015, 21:11

Hallo,
ich bin noch ein anfänger in python Programmierung und daher würde ich gerne wissen wie man zwei listen kombiniert und dazu noch eine filterung durchführt:

Mit zip möchte ich zwei listen kombinieren
beispiel:

time = [1,4,9,12]
word = [garbage,python,world,hello]

und als ergebnis will ich dies:
result=[(4,python),(9,world),(12,hello)]

--> also wenn in der liste word garbage vorkommt, soll garbage rausgefiltert mit der entsprechenden kombinitation.

vielen dank.
BlackJack

@mr-sansibar: Je nach Python-Version `itertools.izip()` oder `zip()` und eine „list comprehension“ mit einem ``if`` zum Filtern sind wohl das einfachste.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@mr-sansibar: Du zippst erst die beiden Listen und filterst dann die Tuple aus, die als zweites Element "garbage" enthalten.
mr-sansibar
User
Beiträge: 4
Registriert: Dienstag 27. Oktober 2015, 21:11

auf ein beispiel coding wäre ich sehr dankbar!
BlackJack

@mr-sansibar: List Comprehensions werden zum Beispiel im Tutorial in der Python-Dokumentation erklärt.
stefanbunde
User
Beiträge: 29
Registriert: Dienstag 20. Oktober 2015, 12:59

erst einmal ist es immer hilfreich, wenn du bei solchen problemen die python-version benennst, mit der du arbeitest. da gibt es nämlich feine unterschiede zwischen der 2er und 3er version.

mit zip lagst du ja schon ganz richtig. nächstes python-buildin wäre filter ;-)
hier ein bsp in version 2.7

Code: Alles auswählen

In [1]: numbers, words = [1, 4, 9, 12], ["garbage", 'python', "world", "hello"]

In [2]: filter(lambda x: x[1] is not "garbage", zip(numbers, words))
Out[2]: [(4, 'python'), (9, 'world'), (12, 'hello')]
alternativ kannst du auch die schon benannten list comprehension nutzen
diese sind oftmal der much-more-readable way :-)

Code: Alles auswählen

In [3]: [x for x in zip(numbers, words) if "garbage" not in x]
Out[3]: [(4, 'python'), (9, 'world'), (12, 'hello')]
gibt natürlich noch etliche weitere gangbare lösungen. filter zb ist noch performanter, wenn das lambda außerhalb definiert wird.
BlackJack

@stefanbunde: `filter()` ist es egal wo die Testfunktion definiert wird. Das macht keinen Geschwindigkeitsunterschied.
stefanbunde
User
Beiträge: 29
Registriert: Dienstag 20. Oktober 2015, 12:59

ah stimmt. denkfehler.
aus irgendeinem grund dachte ich, die funktion wird jedes mal neu definiert :-)
danke für den hinweis
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@stefanbunde: das Äquivalent zu Python3s zip Funktion ist in Python2 itertools.izip. Damit sparst Du Dir das Erzeugen einer Liste mit allen Elementen.
stefanbunde
User
Beiträge: 29
Registriert: Dienstag 20. Oktober 2015, 12:59

@sirius3: danke für den hinweis. normalerweise bin ich auch ein freund von iteratoren. aber bei anfängern versuche ich erstmal mit einfachen code-beispielen auszuhelfen. wenn man denen gleich mit den high-end-bibliotheken kommt, die sie vllt noch nicht verstehen, ist das eventuell nicht sehr förderlich :-)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@stefanbunde: Deine `filter` und LC Version sind nicht aequivalent und beide tun nicht das verlangte.

Code: Alles auswählen

lambda x: x[1] is not "garbage"
ist ein Identitaetsvergleich und das gezeigte Ergebnis ist nicht garantiert, sondern wahrscheinlich nur ein Ergebnis davon, dass "garbage" beides Mal ein Stringliteral ist und kurz hintereinander vorkommt.

Code: Alles auswählen

lambda x: x[1] != "garbage"
tut das geforderte.

Code: Alles auswählen

[x for x in zip(numbers, words) if "garbage" not in x]
wuerde auch aussortieren, wenn `numbers` "garbage" enthaelt.

Kommen wir wieder zum selben Ausdruck:

Code: Alles auswählen

[x for x in zip(numbers, words) if x[1] != "garbage"]
mr-sansibar
User
Beiträge: 4
Registriert: Dienstag 27. Oktober 2015, 21:11

Vielen Dank für die hilfreichen Anmerkungen.
Antworten