본문 바로가기
Language_/python

[python] RuntimeError: deque mutated during iteration. 해결방법

by 낭람_ 2020. 8. 22.
반응형
prog = collections.deque([5,4,3,2,1])
answer = []
while len(prog) > 0 :
    tmp = prog.pop(0)
    cnt = 1
    for i in prog :
        if tmp < i :
            break
        prog.pop(0)
        cnt += 1
    answer.append(cnt)

[프로그래머스] 기능개발

 

[프로그래머스] 기능개발

문제 설명 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 ��

security-nanglam.tistory.com

 

프로그래머스 문제를 풀다가  RuntimeError: deque mutated during iteration. 오류가 나왔다.

 

 

이 오류는 collections.defaultdict()을 사용하다 보면 나오는 오류와 비슷하게 생겼다.

RuntimeError: dictionary changed size during iteration

 

오류가 뜨는 이유는 deque가 반복문을 돌릴 때 deque의 내용이 변질되거나 사이즈가 변경될 때 뜨는 오류다.

 

prog = collections.deque([5,4,3,2,1])
answer = []
while len(prog) > 0 :
    tmp = prog.pop(0)
    cnt = 1
    for i in prog :
        if tmp < i :
            break
        prog.pop(0)
        cnt += 1
    answer.append(cnt)

 

for i in prog :
    if tmp < i :
        break
    prog.pop(0)
    cnt += 1

이 부분에서 오류가 나는데, prog의 내용을 반복문을 통해서 돌리지만 prog.pop(0)으로 인해 prog의 내용이 변경되기 때문이다.

 

이 오류를 해결하기 위해서는 list를 새로 만들거나, copy를 사용한다.

 

copy는 모듈을 import 하고 사용을 해야 한다.

 

for i in copy.deepcopy(prog) :
    if tmp < i :
        break
    prog.popleft()
    cnt += 1

 

이런 식으로 deepcopy 또는 copy를 사용하여 반복문을 돌리면 해결 가능하다.

 

for i in list(prog) :
    if tmp < i :
        break
    prog.popleft()
    cnt += 1

 

li = prog[:]
for i in li :
    if tmp < i :
        break
    prog.pop(0)
    cnt += 1

이렇게 list를 복사해서 사용해도 된다. *밑의 방법의 경우에는 prog가 deque가 아닌 list 형태다.

반응형

댓글