ProgramingTip

Python의 for 루프에서 목록 요소를 제거하는 방법은 무엇입니까?

bestdevel 2020. 11. 29. 12:04
반응형

Python의 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[:] = []

또는 while루프를 사용할 수 있습니다 .

while a:
  print a.pop(0)

조건과 일치하는 항목을 강화합니다. 그런 다음 다음 항목으로 이동합니다.

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

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

또는 목록 이해력을 사용 하고 결과를 다시 할당 할 수 있습니다 .filtera

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']

다른 답변에서 말했듯이이를 수행하는 가장 좋은 방법은 새 목록을 만드는 것입니다. 복사본을 반복하거나 원하는 요소로만 목록을 구성하고 동일한 변수에 다시 할당합니다. 사례에 따라 달라집니다. 원래 목록의 다른 변수에 다르게 영향을 미치기 때문입니다 (또는 첫 번째 변수는 영향을 미치고 두 번째 변수에 영향을줍니다).

어떤 버전의 복사본이 옵션이 아닌 경우 반복하는 목록을 수정하는 이유에 대한 이해에 의존하는 다른 옵션이 하나 있습니다. 목록 반복은 강화를 추적하여 목록의 끝에서 떨어질 때까지 루프를 돌 때마다 증가합니다. 현재 모든 곳에서 (또는 이전) 제거하면 해당 지점부터 끝까지 항목이 있습니다. 반복자는 이것 그러나에 대해 줄 알지 못하며 다음 요소가 아닌 현재 색인에 있기 때문에 다음 요소를 효과적으로 건너 뜁니다 . 그러나 현재 인덱스 뒤 6 있는 항목을 제거해도 계명 영향을주지 않습니다.

이것은 목록을 다시 앞으로 반복하는 경우 현재 인덱스에서 항목을 제거하면 오른쪽의 모든 항목이 왼쪽으로 이동하지만 오른쪽에있는 모든 요소를 ​​이미 처리 했으므로 중요하지 않습니다. 현재 위치를 왼쪽으로 이동합니다. 왼쪽의 다음 요소는 변경 사항의 영향을받지 않으므로 반복기가 예상 한 요소를 제공합니다.

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

반응형