>백엔드 개발 >파이썬 튜토리얼 >반복 중에 목록을 수정할 때 루프가 문자열에서 모든 모음을 제거하지 못하는 이유는 무엇입니까?

반복 중에 목록을 수정할 때 루프가 문자열에서 모든 모음을 제거하지 못하는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-13 19:56:17237검색

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

일부 항목을 제거하기 위한 루프 "Forgets"

아래 코드의 목표는 주어진 문자열에서 모음을 제거하는 anti_vowel이라는 함수를 만드는 것입니다. 함수는 간단해 보이지만 "Hey Look Words!"라는 문자열을 처리할 때 "Hy lk Words!"를 생성하면서 흔들립니다. 함수가 "look"의 마지막 "o"를 실수로 제거하지 못했습니다.

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)

문제

이 문제는 목록을 반복하면서 수정하는 데서 발생합니다. 이 접근 방식은 예상치 못한 결과를 초래합니다. 이 문제를 해결하려면 후속 요소의 위치에 영향을 주지 않고 모음을 효율적으로 제거할 수 있도록 입력 목록의 복사본을 만들어야 합니다.

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

더 나은 이해를 위해 다음을 설명하는 코드를 고려하세요. 문제:

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

예상되는 출력은 문자열의 세로 목록이지만 실제 출력은 is:

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!

루프가 진행됨에 따라 요소가 목록에서 제거되고 다음 요소를 건너뜁니다. "look"의 경우 두 번째 "o"는 인덱스가 그 이상으로 진행되었기 때문에 건너뜁니다. 결과적으로, "Words"의 마지막 "o"는 "look"의 "o" 대신 제거됩니다.

권장 접근 방식

Python의 목록 이해를 활용하면 더욱 깔끔하고 간결한 솔루션을 제공합니다.

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

위 내용은 반복 중에 목록을 수정할 때 루프가 문자열에서 모든 모음을 제거하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.