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.
Zip von zwei Listen mit Filterung
@mr-sansibar: Je nach Python-Version `itertools.izip()` oder `zip()` und eine „list comprehension“ mit einem ``if`` zum Filtern sind wohl das einfachste.
-
- User
- Beiträge: 4
- Registriert: Dienstag 27. Oktober 2015, 21:11
auf ein beispiel coding wäre ich sehr dankbar!
@mr-sansibar: List Comprehensions werden zum Beispiel im Tutorial in der Python-Dokumentation erklärt.
-
- 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
alternativ kannst du auch die schon benannten list comprehension nutzen
diese sind oftmal der much-more-readable way
gibt natürlich noch etliche weitere gangbare lösungen. filter zb ist noch performanter, wenn das lambda außerhalb definiert wird.
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')]
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')]
@stefanbunde: `filter()` ist es egal wo die Testfunktion definiert wird. Das macht keinen Geschwindigkeitsunterschied.
-
- 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
aus irgendeinem grund dachte ich, die funktion wird jedes mal neu definiert
danke für den hinweis
-
- 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
- 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.
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.
wuerde auch aussortieren, wenn `numbers` "garbage" enthaelt.
Kommen wir wieder zum selben Ausdruck:
Code: Alles auswählen
lambda x: x[1] is not "garbage"
Code: Alles auswählen
lambda x: x[1] != "garbage"
Code: Alles auswählen
[x for x in zip(numbers, words) if "garbage" not in x]
Kommen wir wieder zum selben Ausdruck:
Code: Alles auswählen
[x for x in zip(numbers, words) if x[1] != "garbage"]
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
-
- User
- Beiträge: 4
- Registriert: Dienstag 27. Oktober 2015, 21:11
Vielen Dank für die hilfreichen Anmerkungen.