작지만 꾸준한 반복

[python] for loop list remove() 사용 주의점 본문

트러블슈팅

[python] for loop list remove() 사용 주의점

iamjooon2 2022. 7. 17. 23:24

파이썬 사용 중 list를 for loop를 돌리면서 하나씩 제거하려고 했는데 자꾸 요상하게 삭제됐다

코드는 다음과 같다

K = 4200
money_list = [50000, 10000, 5000, 1000, 500, 100, 50, 10]

for money in money_list:
	if money > K:
    	money_list.remove(money)

print(money_list) # [10000, 1000, 500, 100, 50, 10]

money_list 속 원소를 돌며 조건에 해당하는 원소를 제거하려고 하는 상황이다

조건에 해당하는 50000, 10000, 5000이 모두 삭제되어야 하지만, 그렇지 않고 10000은 그대로 남아있는 것을 볼 수 있다

 

이유는 무엇일까?

remove() 사용시 리스트의 구조를 생각해보자

첫번째 루프를 돌며 0번째 원소인 50000을 삭제한 후, 리스트는 [10000, 5000, 1000, 500, 100, 50, 10]

두번째 루프를 돌며, 1번째 원소인 10000을 삭제하려 하지만 0번째 원소인 50000이 삭제된 상태이므로
1번째 원소가 5000이 되어
10000을 건너뛰게 되는 것이다.

 

그렇다면 어떻게 해결해야 할까?

리스트틀 카피하는 방식으로 해결 할 수 있다

K = 4200
money_list = [50000, 10000, 5000, 1000, 500, 100, 50, 10]
for i in money_list[:]:
	if i > K:
    	money_list.remove(i)

print(money_list) # [1000, 500, 100, 50, 10]

슬라이싱을 통해 money_list의 사본을 루프로 돌리는 방식으로 해결 할 수 있다

 

앞으로 리스트로 for loop를 돌릴 때 원본이 아닌 복사본으로 돌리도록 하자

 

결론 : 리스트로 for loop를 돌릴 때 원본이 아닌 복사본을 돌려라

 

Reference

https://stackoverflow.com/questions/1207406/how-to-remove-items-from-a-list-while-iterating

 

How to remove items from a list while iterating?

I'm iterating over a list of tuples in Python, and am attempting to remove them if they meet certain criteria. for tup in somelist: if determine(tup): code_to_remove_tup What should...

stackoverflow.com