Seite 1 von 1

Zip von zwei Listen mit Filterung

Verfasst: Dienstag 27. Oktober 2015, 21:27
von mr-sansibar
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.

Re: Zip von zwei Listen mit Filterung

Verfasst: Dienstag 27. Oktober 2015, 21:32
von BlackJack
@mr-sansibar: Je nach Python-Version `itertools.izip()` oder `zip()` und eine „list comprehension“ mit einem ``if`` zum Filtern sind wohl das einfachste.

Re: Zip von zwei Listen mit Filterung

Verfasst: Dienstag 27. Oktober 2015, 21:33
von Sirius3
@mr-sansibar: Du zippst erst die beiden Listen und filterst dann die Tuple aus, die als zweites Element "garbage" enthalten.

Re: Zip von zwei Listen mit Filterung

Verfasst: Dienstag 27. Oktober 2015, 22:01
von mr-sansibar
auf ein beispiel coding wäre ich sehr dankbar!

Re: Zip von zwei Listen mit Filterung

Verfasst: Dienstag 27. Oktober 2015, 22:14
von BlackJack
@mr-sansibar: List Comprehensions werden zum Beispiel im Tutorial in der Python-Dokumentation erklärt.

Re: Zip von zwei Listen mit Filterung

Verfasst: Mittwoch 28. Oktober 2015, 08:52
von stefanbunde
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.

Re: Zip von zwei Listen mit Filterung

Verfasst: Mittwoch 28. Oktober 2015, 10:31
von BlackJack
@stefanbunde: `filter()` ist es egal wo die Testfunktion definiert wird. Das macht keinen Geschwindigkeitsunterschied.

Re: Zip von zwei Listen mit Filterung

Verfasst: Mittwoch 28. Oktober 2015, 10:55
von stefanbunde
ah stimmt. denkfehler.
aus irgendeinem grund dachte ich, die funktion wird jedes mal neu definiert :-)
danke für den hinweis

Re: Zip von zwei Listen mit Filterung

Verfasst: Mittwoch 28. Oktober 2015, 11:48
von Sirius3
@stefanbunde: das Äquivalent zu Python3s zip Funktion ist in Python2 itertools.izip. Damit sparst Du Dir das Erzeugen einer Liste mit allen Elementen.

Re: Zip von zwei Listen mit Filterung

Verfasst: Mittwoch 28. Oktober 2015, 14:18
von stefanbunde
@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 :-)

Re: Zip von zwei Listen mit Filterung

Verfasst: Mittwoch 28. Oktober 2015, 15:11
von cofi
@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"]

Re: Zip von zwei Listen mit Filterung

Verfasst: Mittwoch 28. Oktober 2015, 23:16
von mr-sansibar
Vielen Dank für die hilfreichen Anmerkungen.