Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapakah gelung saya gagal mengalih keluar semua vokal daripada rentetan apabila mengubah suai senarai semasa lelaran?

Mengapakah gelung saya gagal mengalih keluar semua vokal daripada rentetan apabila mengubah suai senarai semasa lelaran?

DDD
DDDasal
2024-12-13 19:56:17237semak imbas

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

Gelung "Lupa" untuk Mengalih Keluar Beberapa Item

Dalam kod di bawah, objektifnya adalah untuk mencipta fungsi yang dipanggil anti_vokal yang menghilangkan vokal daripada rentetan yang diberikan. Walaupun fungsi itu kelihatan mudah, ia goyah apabila berurusan dengan rentetan "Hey look Words!", menghasilkan "Hy lk Words!". Fungsi ini secara tidak sengaja gagal mengalih keluar "o" akhir dalam "lihat".

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)

Masalahnya

Isu ini berpunca daripada mengubah suai senarai sambil mengulanginya. Pendekatan ini membawa kepada akibat yang tidak dijangka. Untuk membetulkan perkara ini, salinan senarai input hendaklah dibuat, membolehkan penyingkiran vokal yang cekap tanpa menjejaskan kedudukan elemen seterusnya.

for char in textlist[:]: #shallow copy of the list
    # etc

Untuk pemahaman yang lebih baik, pertimbangkan kod berikut yang menggambarkan masalah:

textlist = ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
for char in textlist:
    print(char, textlist)

Output yang dijangkakan ialah senarai menegak rentetan, tetapi output sebenar ialah:

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!

Semasa gelung berlangsung, elemen dialih keluar daripada senarai, melangkau elemen seterusnya. Dalam kes "lihat", "o" kedua dilangkau kerana indeks telah maju melepasinya. Akibatnya, "o" terakhir dalam "Words" dialih keluar dan bukannya dalam "look."

Pendekatan Disyorkan

Memanfaatkan pemahaman senarai Python menawarkan penyelesaian yang lebih bersih dan ringkas:

def remove_vowels(text): # function names should start with verbs! :)
    return ''.join(ch for ch in text if ch.lower() not in 'aeiou')

Atas ialah kandungan terperinci Mengapakah gelung saya gagal mengalih keluar semua vokal daripada rentetan apabila mengubah suai senarai semasa lelaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn