programing

파이썬에서 for 루프에서 리스트 요소를 제거하는 방법?

codeshow 2023. 10. 4. 23:03
반응형

파이썬에서 for 루프에서 리스트 요소를 제거하는 방법?

리스트가 있습니다.

a = ["a", "b", "c", "d", "e"]

아래와 같은 for 루프에서 이 목록의 요소를 제거하고자 합니다.

for item in a:
    print(item)
    a.remove(item)

하지만 효과가 없습니다.어쩌죠?

를 사용하여 반복하는 동안 목록에서 요소를 제거할 수 없습니다.for고리.

코드를 다시 쓰는 가장 좋은 방법은 무엇을 하려고 하느냐에 달려 있습니다.

예를 들어 코드는 다음과 같습니다.

for item in a:
    print(item)
a[:] = []

아니면, 당신은 a를 사용할 수 있습니다.while루프:

while a:
    print(a.pop())

조건이 맞으면 물건을 제거하려고 합니다.그러면 다음 아이템으로 갑니다.

조건과 일치하지 않는 모든 요소를 두 번째 목록에 복사할 수 있습니다.

result = []
for item in a:
    if condition is False:
        result.append(item)
a = result

또는 목록 이해를 사용하거나 목록을 작성한 후 결과를 다음 위치에 다시 할당할 수 있습니다.a:

a = filter(lambda item:... , a)

아니면

a = [item for item in a if ...]

어디에...는 확인해야 할 조건을 나타냅니다.

목록 복사본을 통해 반복합니다.

>>> a = ["a", "b", "c", "d", "e"]
>>> for item in a[:]:
    print(item)
    if item == "b":
        a.remove(item)

a
b
c
d
e
>>> print(a)
['a', 'c', 'd', 'e']

다른 답변에서도 알 수 있듯이, 가장 좋은 방법은 새 목록을 만드는 것입니다. - 복사본을 반복하거나 원하는 요소로만 목록을 구성하여 동일한 변수에 다시 할당하는 것입니다.이러한 변수 간의 차이는 원래 목록의 다른 변수에 다른 영향을 주기 때문에(또는 첫 번째 변수는 영향을 미치지만 두 번째 변수는 영향을 주지 않기 때문에) 사용 사례에 따라 달라집니다.

복사가 어떤 이유로 선택사항이 아닌 경우, 반복 중인 목록을 수정하는 이유를 이해하는 데 의존하는 다른 선택사항이 하나 더 있습니다.목록 반복은 인덱스를 추적하여 목록의 끝에서 떨어질 때까지 루프를 중심으로 매번 증가시킵니다.따라서 현재 인덱스(또는 그 이전)에서 제거하면 해당 시점부터 끝까지 모든 것이 왼쪽으로 한 자리 이동합니다.그러나 반복자는 이 사실을 알지 못하며, 현재 다음 요소가 아닌 현재 인덱스에 있기 때문에 효과적으로 다음 요소를 건너뜁니다.그러나 현재 지수 이후의 것들을 제거하는 것은 영향을 미치지 않습니다.

이는 목록을 앞에서 뒤로 반복하면 현재 인덱스에서 항목을 제거하면 해당 항목의 모든 항목이 오른쪽으로 이동합니다. 그러나 현재 위치의 오른쪽으로 이미 모든 요소를 처리하고 왼쪽으로 이동하므로 문제가 되지 않습니다. 왼쪽의 다음 요소는 변경에 영향을 받지 않습니다.그래서 이터레이터는 당신이 기대하는 요소를 제공합니다.

TL;DR:

>>> a = list(range(5))
>>> for b in reversed(a):
    if b == 3:
        a.remove(b)
>>> a
[0, 1, 2, 4]

그러나 코드를 쉽게 읽을 수 있도록 복사하는 것이 일반적으로 더 좋습니다.저는 단지 완성도를 위해서 이 가능성을 언급할 뿐입니다.

import copy

a = ["a", "b", "c", "d", "e"]

b = copy.copy(a)

for item in a:
    print(item)
    b.remove(item)
a = copy.copy(b)

: 의 .a하고 합니다에서 합니다.b. 그리고 당신은 복사합니다.b 다시 을)로 .a.

새 목록을 만들고 해당 새 목록에 원하는 요소를 추가하는 것은 어떻습니까?목록을 반복하는 동안에는 요소를 제거할 수 없습니다.

아마 답하기엔 좀 늦었을 것입니다. 하지만 방금 이 스레드를 찾았고 이전에 이 스레드에 대한 코드를 만든 적이 있습니다.

    list = [1,2,3,4,5]
    deleteList = []
    processNo = 0
    for item in list:
        if condition:
            print(item)
            deleteList.insert(0, processNo)
        processNo += 1

    if len(deleteList) > 0:
        for item in deleteList:
            del list[item]

그것은 그것을 하기에는 먼 길일 수도 있지만 잘 될 것 같습니다.삭제할 목록 항목과 관련된 숫자만 저장하는 두 번째 목록을 만듭니다."삽입"은 목록 항목 번호를 0 위치에 삽입하고 나머지를 밀어 항목을 삭제할 때 목록이 가장 높은 숫자에서 가장 낮은 숫자로 다시 삭제되므로 목록이 순서대로 유지됩니다.

언급URL : https://stackoverflow.com/questions/10665591/how-to-remove-list-elements-in-a-for-loop-in-python

반응형