Python/Python Basic

for 문을 사용하여 list 값 remove 할 때 주의 할 점 - 공부하는 도비

DOVISH WISDOM 2021. 11. 8. 18:21  
728x90
반응형

리스트에 있는 값을 for문으로 하나하나 삭제해보려고 했지만, 계속 리스트 범위를 벗어났다는 등의 오류가 났습니다. 

 

다음 코드를 보며, 어떤 오류가 있는지 살펴보겠습니다. 

test = list(range(0, 10))   # test = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print("original test : ", test)

for i in test:
    test.remove(i)
    print(test)

해당 코드를 실행시키면, 위와 같은 결과가 나옵니다. 

 

문제의 원인은,

 

첫 번째 루프 때는 test의 0번째 원소를 지우므로 리스트는 [1, 2, 3, 4, 5, 6, 7, 8, 9]가 됩니다.

 

두 번째 for문을 돌 때는, test의 1번째 원소(test = [1, 2, 3, 4, 5, 6, 7, 8, 9])를 지우므로, 1을 건너뛰게 됩니다. 

두 번째 for문이 끝나면 test = [1, 3, 4, 5, 6, 7, 8, 9]가 되고,

 

세 번째도 마찬가지로, test의 2번째 원소(test = [1, 3, 4, 5, 6, 7, 8, 9])를 지우기 때문에, 모든 원소에 대해 접근하지 않는다는 걸 확인할 수 있습니다. 

 

원하는대로 데이터를 삭제하기 위해서는, 

해당 리스트를 카피하는 방식으로 접근할 수 있습니다. 

 

첫 번째 방법은 원래의 리스트를 다른 리스트에 카피해주는 것이고, 

 

test = list(range(0, 10))   # test = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print("original test : ", test)

temp = test[::]


for j in temp:
    test.remove(j)
    print(test)

두 번째 방법은, 다른 변수를 사용하기 싫다면, 

 

test = list(range(0, 10))   # test = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print("original test : ", test)

for j in test[::]:
    test.remove(j)
    print(test)

for 문 선언부에 test의 복사본을 두어도 동일한 결과를 얻을 수 있습니다.

 

 

 

 

* 리스트 값 제거(remove, delete) 하는 방법 알아보기 *

2020.06.08 - [파이썬/파이썬 이론] - [파이썬] 파이썬 list(리스트), append(), reverse(), insert(), remove(), pop(), extend(), delete 함수 사용 - 공부하는 도비

 

[파이썬] 파이썬 list(리스트), append(), reverse(), insert(), remove(), pop(), extend(), delete 함수 사용 - 공부

파이썬 타입은 크게 '숫자(number), 순서 열(sequence), 매핑(mapping), 집합(set)'으로 구분할 수 있습니다. 오늘은 순서 열 중 list(리스트)에 관해서 정리해보려고 합니다. 또한, 리스트와 연관 지어 append(

yang-wistory1009.tistory.com

 

반응형