일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 우테코
- github action
- HashCode
- Signature
- 해커톤
- 라이징캠프
- 동일성
- Payload
- equlas
- ssh-action
- 이코테
- makeus
- 이것이취업을위한코딩테스트다
- nestJS
- JWT
- CMC
- 컴공선배
- forloop
- CICD
- 나동빈
- Hackathon
- 우아한테크코스
- 동빈북
- object
- 왕실의나이트
- remove
- 동등성
- 너디너리
- loop
- 딕셔너리
- Today
- Total
iamjooon2님의 블로그
[python] for loop list remove() 사용 주의점 본문
파이썬 사용 중 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
'트러블슈팅' 카테고리의 다른 글
Lombok is- 필드 직렬화 버그 트러블슈팅 (0) | 2024.02.09 |
---|---|
Java optional - OrElse, OrElseGet 알고쓰자 (0) | 2023.08.20 |
[Javascript] forEach는 async를 안기다려준다 (0) | 2022.09.07 |
[ORACLE 19C] ORA-01017: 사용자명/비밀번호가 부적합, 로그온 할 수 없습니다. (0) | 2022.04.04 |