Heim > Backend-Entwicklung > Python-Tutorial > Warum kann meine Schleife nicht alle Vokale aus einer Zeichenfolge entfernen, wenn ich die Liste während der Iteration ändere?

Warum kann meine Schleife nicht alle Vokale aus einer Zeichenfolge entfernen, wenn ich die Liste während der Iteration ändere?

DDD
Freigeben: 2024-12-13 19:56:17
Original
233 Leute haben es durchsucht

Why does my loop fail to remove all vowels from a string when modifying the list during iteration?

Schleife „vergisst“, einige Elemente zu entfernen

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)
Nach dem Login kopieren

Das Problem

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
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!
Nach dem Login kopieren

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.

Empfohlener Ansatz

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')
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage