[Python] for문에서 remove 쓸때 주의점

김영환·2021년 2월 23일
0

Python

목록 보기
11/11
post-thumbnail

for문에서 리스트에 대한 값들을 하나씩 지워나가려는 코드를 구현하고 있엇는데 오류가 뜨길래 왜 문제가 없어보이는데 계속 안될까 고민을 하던 도중 내가 생각하는 방향과 다르게 코드가 진행 된다는 사실을 알게 되었다.

이것이 문제의 코드다. 이중for문을 사용하여 lost의 list값과 reserve의 list값이 같은 것이 있으면 그것을 각각 제거하고 순차적으로 두 list를 비교하는 코드를 구현하였다. 하지만 내 생각과 다르게 계속 모든 값들이 제거가 안되였다...

# lost 와 reserve 는 리스트 형태이다.
    for l in lost:
        for r in reserve:
            if l == r:
                reserve.remove(r)
                lost.remove(l)
                answer += 1
                break

대체 무엇이 문제였을까? 계속 고민을 하던중 for문을 돌때 remove list 매소드의 문제라고 생각하여 예제 코드를 한번 구현해보았다.

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

 # 1 3 5 
 # [2,4]

아니 왜 모든 값을 제거를 못하고 2,4를 제거를 못하고 왜 이러고 있는가... 후
문제의 원인은 remove시 원본 리스트 데이터도 훼손되기 때문에 발생하는것 같다.
1번째 루프에서 0번째 원소 1를 지우므로 리스트는 [2,3,4,5] 가 되고
2번째 루프에서 1번째 원소를 가져오는데 이는 3 이 된다. 즉, 2는 건너 뛰게 된다.

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

# 1 2 3 4 5 
# []

for문에서 원본리스트를 복제하는 형태로 만들어 주었더니 원래대로 작동하는 것을 알 수 있었다.
for문을 처음 돌릴때의 리스트형태를 기억하고 있어서, [1,2,3,4,5] 에서 index[1]의 값을 돌리고 난뒤 remove에 의해서 [2,3,4,5] 가 된상태에서 for문은 index[2]의 값을 돌려야되니 for문 입장에서는 index[2]값인 3으로 for문을 돌리게 되었고, 2는 생략되는 형태라고 이해하면 될것같다.. 누구든지 나같은 실수를 안하고 코드를 짜기를 바란다 .. 이만 💛

1개의 댓글

comment-user-thumbnail
2022년 2월 4일

선생님 정말 감사합니다ㅠㅠㅠㅠㅠㅠㅠ정말 너무 감사합니다 3일 내내 해결 못했는데 너무 명쾌하게 해결되었어요 새해 복 많이 받으세요ㅠㅠㅠㅠㅠㅠㅠ

답글 달기