Im folgenden Code besteht das Ziel darin, eine Funktion namens anti_vowel zu erstellen, die Vokale aus einer bestimmten Zeichenfolge entfernt. Während die Funktion unkompliziert erscheint, gerät sie ins Stocken, wenn sie mit der Zeichenfolge „Hey Look Words!“ arbeitet und „Hy lk Words!“ erzeugt. Die Funktion entfernt versehentlich das letzte „o“ in „look“.
text = "Hey look Words!" def anti_vowel(text): textlist = list(text) for char in textlist: if char.lower() in 'aeiou': textlist.remove(char) return "".join(textlist) print anti_vowel(text)
Das Problem ergibt sich aus der Änderung der Liste beim Durchlaufen. Dieser Ansatz führt zu unerwarteten Konsequenzen. Um dies zu beheben, sollte eine Kopie der Eingabeliste erstellt werden, die das effiziente Entfernen von Vokalen ermöglicht, ohne die Position nachfolgender Elemente zu beeinträchtigen.
for char in textlist[:]: #shallow copy of the list # etc
Zum besseren Verständnis betrachten Sie den folgenden Code, der das veranschaulicht Problem:
textlist = ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] for char in textlist: print(char, textlist)
Die erwartete Ausgabe wäre eine vertikale Liste der Zeichenfolge, aber die tatsächliche Ausgabe ist:
H ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] e ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] # ! l ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] o ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] k ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] # Problem!! ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] W ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] o ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] d ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] s ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] ! ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] Hy lk Words!
Im Verlauf der Schleife werden Elemente aus der Liste entfernt und das nächste Element übersprungen. Bei „look“ wird das zweite „o“ übersprungen, da der Index darüber hinaus fortgeschritten ist. Folglich wird das letzte „o“ in „Words“ anstelle des in „look“ entfernt.
Die Nutzung des Listenverständnisses von Python bietet eine sauberere und prägnantere Lösung:
def remove_vowels(text): # function names should start with verbs! :) return ''.join(ch for ch in text if ch.lower() not in 'aeiou')
Das obige ist der detaillierte Inhalt vonWarum kann meine Schleife nicht alle Vokale aus einer Zeichenfolge entfernen, wenn ich die Liste während der Iteration ändere?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!