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
또는 목록 이해력을 사용 하고 결과를 다시 할당 할 수 있습니다 .filter
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']
다른 답변에서 말했듯이이를 수행하는 가장 좋은 방법은 새 목록을 만드는 것입니다. 복사본을 반복하거나 원하는 요소로만 목록을 구성하고 동일한 변수에 다시 할당합니다. 사례에 따라 달라집니다. 원래 목록의 다른 변수에 다르게 영향을 미치기 때문입니다 (또는 첫 번째 변수는 영향을 미치고 두 번째 변수에 영향을줍니다).
어떤 버전의 복사본이 옵션이 아닌 경우 반복하는 목록을 수정하는 이유에 대한 이해에 의존하는 다른 옵션이 하나 있습니다. 목록 반복은 강화를 추적하여 목록의 끝에서 떨어질 때까지 루프를 돌 때마다 증가합니다. 현재 모든 곳에서 (또는 이전) 제거하면 해당 지점부터 끝까지 항목이 있습니다. 반복자는 이것 그러나에 대해 줄 알지 못하며 다음 요소가 아닌 현재 색인에 있기 때문에 다음 요소를 효과적으로 건너 뜁니다 . 그러나 현재 인덱스 뒤 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
'ProgramingTip' 카테고리의 다른 글
Modernizr 파일을 헤드에 배치해야합니까? (0) | 2020.11.29 |
---|---|
기본 Python 클라이언트 소켓 소켓 (0) | 2020.11.29 |
편집 할 수 없어야하는 EditText 안에 상수 텍스트 삽입 -Android (0) | 2020.11.29 |
R에서 각각 고유 한 색상으로 여러 선 (데이터 시리즈) 플로팅 (0) | 2020.11.29 |
NSUserDefaults에 NSMutablearray를 저장하는 방법 (0) | 2020.11.29 |