[python] for문을 돌리면서 리스트값 지울 시 주의할점 (feat. remove())

조시현·2022년 7월 22일
0

Python

목록 보기
4/8

백준 2309 일곱 난쟁이를 풀던 도중
자꾸 index error와 name error가 나오는 것이다.
그러하여서 코드에 의문을 가지던 중
for문에서 리스트에 대한 값들을 하나씩 지워나가려는 부분에서 에러가 발생함을 알고
왜 이런 에러가 나는지 나의 뇌 알고리즘이 이해를 못하여서
검색을 하고 눈이 번쩍 뜨였다.

nam1,num2 = 0,0
nan_key = list(int(input()) for i in range(9))

for i in range(9):
  for j in range(i+1, 9):
    if sum(nan_key) - (nan_key[i] + nan_key[j]) == 100:
      nan_key.remove(num1)
      nan_key.remove(num2)
      break;

        


nan_key.sort()
for k in nan_key:
  print(k)

이렇게 코드를 짯는데 분명 내 머리 속에서는 되어야 했지만
name error가 나타났다.

문제의 원인은 remove()시 원본 리스트 데이터도 훼손이 되기 때문에 발생한다고 한다.

예를 들어

num = [1,2,3,4,5]

for i in num:
	print(i)
    l.remove(i)
    
>1
>3
>5

num의 모든 원소들이 루프를 돌지 않는다.
이렇게 되면 num의 원소가 모두 지워지지 않고 남게 된다.

1번째 반복에서 0번째 원소 1을 지우므로 리스트가 [2,3,4,5]가 되고
2번째 반복에서 1번쨰 원소를 가져오는데 1번째 원소가 3이 되면서
즉, 2가 건너 뛰게 되면서 누락이 발생한다.

그러므로 아래 블로그에서 제시한

num = [1,2,3,4,5]
for i in num[:]:
	print(i)
    l.remove(i)
    
> 1
> 2
> 3
> 4
> 5

l[:]을 통해서 복사본을 루프에 넣고 돌리는 방식을 사용할 수 있다.

그리고 내가 문제를 푸는데 사용한 for문 안에서 값을 저장한 후 for 문 밖에서 제거하는 방법이 있다.

a = []
num = [1,2,3,4,5]
for i in num:
	print(i)
    a.append(i)

for i in a:
	num.remove(i)
  
print(num)

>1
>2
>3
>4
>5

>[]

처럼 완벽하게 지울 수 있다.

for문에 들어가는 리스트가 본사본이 아니라 원본이기 때문에 for문 속 리스트의 원소를 주의해야한다.

출처

https://devpouch.tistory.com/110

profile
소프트웨어 관련 고민을 좋아하고 상황에 맞는 답을 함께 찾아가는 과정을 좋아합니다. 😀

0개의 댓글