elemente aus einer liste entfernen, unter bestimmten Bedingungen

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
kontrapunktstefan
User
Beiträge: 4
Registriert: Dienstag 26. Januar 2016, 11:01

Hallo zusammen,
bitte seid nachsichtig mit mir, denn mein Problem ist gewiss ein Anfängerfehler.
Ich möchte aus einer Liste, die Strings enthält, bestimmte Strings entfernen, wenn ein Substring in einem der Strings nicht vorkommt.
Hier mein kleines Beispiel:

Code: Alles auswählen

#!/usr/bin/env python3
zeuch = "xyz yxa abc afg xiy"
zeuch = zeuch.split()
for z in zeuch:
    if "x" not in zeuch:
        zeuch.remove(z)
print(zeuch)
Als Ergebnis hötte ich erwartet:
['xyz'. 'yxa', 'xiy']
Stattdessen bekomme ich:
['yxa', 'afg']
Wie kann das sein, bzw. auf welche Weise kann ich mein Problem lösen?
BlackJack

@kontrapunktstefan: Wann ist denn ``'x' not in zeuch`` wahr? Was ist in `zeuch` enthalten? Bei den Daten jemals ein 'x'? Doch wohl eher nein.

Der zweite Fehler ist das verändern einer Liste über die Du gerade iterierst. Das funktioniert nicht, weil die Schleife diese Änderungen nicht mitbekommt. Man erstellt an der Stelle üblicherweise eher eine neue Liste die nur die Elemente enthält, die man haben möchte. Das kann man auch recht kompakt mit einer „list comprehension“ ausdrücken. `remove()` hat zusätzlich noch ein Effizienzproblem weil das nach dem Element ja vom Anfang der Liste an noch mal linear sucht.

Code: Alles auswählen

In [32]: zeuch
Out[32]: ['xyz', 'yxa', 'abc', 'afg', 'xiy']

In [33]: [z for z in zeuch if 'x' in z]
Out[33]: ['xyz', 'yxa', 'xiy']
kontrapunktstefan
User
Beiträge: 4
Registriert: Dienstag 26. Januar 2016, 11:01

Vielen Dank!
Ich sehe, ich muss erst mal 'list comprehension' googeln.
Grüße,
Stefan
BlackJack

@kontrapunktstefan: Das steht auch in der Python-Dokumentation und in dem Tutorial in der Python-Dokumentation. Bevor man da im ganzen Internet nach sucht…
Benutzeravatar
Kebap
User
Beiträge: 786
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

kontrapunktstefan hat geschrieben: ich muss erst mal 'list comprehension' googeln.
"muss" ist zu viel gesagt. Man kann das auch auf mehrere Befehle / Zeilen auftrennen. Das oben ist einfach schöner.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Antworten