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.
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.
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:
Re: Zip von zwei Listen mit Filterung
Verfasst: Mittwoch 28. Oktober 2015, 23:16
von mr-sansibar
Vielen Dank für die hilfreichen Anmerkungen.