Programming/Python

[Python 3.7] 딕셔너리 표현식 특정 키-값 삭제하기 (RuntimeError: dictionary changed size during iteration)

Nirsa 2019. 12. 24. 02:02
반응형

 

딕셔너리 표현식을 이용한 특정 키-값 삭제하는 방법 입니다. (RuntimeError: dictionary changed size during iteration)

 

잘못된 코드

a = {'one': 1, 'two': 2, 'three': 3, 'four': 4}   ## 예시를 위해 간단한 딕셔너리 생성 

for key, value in a.items():                    

    if value == 3:                               

        a.pop(key)                                ## 값이 3이면 키-값 쌍 삭제

print(a)

실행 결과

 

for문에 의해 반복하던 도중에 값이 3인것을 찾아 삭제 후 딕셔너리의 크기가 바껴서 생기는 에러 입니다.

위처럼 간단한 코드로 삭제는 정상적으로 되나, for문안에 다른 내용들이 있을 경우 for문이 멈추게 되면서 정상적인 기능을 수행할 수 없게 됩니다.

 

때문에 딕셔너리 표현식에서 if 조건문을 사용하여 삭제할 값을 제외 후 새로운 딕셔너리를 생성 해주어야 합니다.

 

- {키: 값 for 키, 값 in 딕셔너리 if 조건식}

- dict({키: 값 for 키, 값 in 딕셔너리 if 조건식})

 

예시 코드

a = {'one': 1, 'two': 2, 'three': 3, 'four': 4}   ## 예시를 위해 간단한 딕셔너리 생성

a = {key: value for key, value in a.items() if value != 2}  ## 값이 2인것 빼고(1,3,4) a변수에 딕셔너리를 생성

또는

a = dict({key: value for key, value in a.items() if value != 2}) ## 값이 2인것 빼고(1,3,4) a변수에 딕셔너리를 생성

 

출력만 하고 싶다면 변수에 저장하는 부분만 생략 하시면 됩니다.

 

직접 키-값을 삭제하는 방식이 아니라, 삭제할 키-값을 if 조건식을 통해 제외를 하고 나서 새로운 딕셔너리를 만드는 방식입니다.

 

반응형