python Dictionary 추가, 삭제, 수정 관련 질문드립니다.

조회수 1366회

python dictionary에 새로운 value를 추가할 때 'dictionary changed size during iteration' 에러가 발생됩니다.

Table 내의 데이터를 select 해서 search_dict(Type:dictionary)에 값을 넣었습니다. Value Type은 리스트입니다. 키는 고유의 키로 넣었습니다.

self.search_dict = {} (초기화)

key : 12가1010S // Value : [12가1010', '20191211105820', 'S']
key : 13가2020S // Value : ['13가2020', '20191211105820', 'S']
key : 44가2030S // Value : ['44가2030', '20191211105820', 'S']

위와 같이 search_dict에 데이터가 있고 로직 순서대로 진행 후 새로운 데이터가 발생되면

list = "['55가1234','20191211105822','S']" (새로운 데이터 삽입)
self.search_dict['55가1234S'] = list

위와 같이 search_dict에 새로운 데이터를 추가하려고 합니다. 이 때, 'dictionary changed size during iteration' 에러가 발생되는데

분명히 테스트로 순서대로 데이터를 삽입하면 정상적으로 추가가 되었는데, 왜 안되는지 이해가 되질 않습니다..

python 테스트로 위와 같이 key, value 실행 한 결과는 아래와 같습니다.

이미지

추가적으로 에러가 발생되는 코드 부분입니다.

이미지

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 문제가 발생하는 코드를 최소화해서 올려보세요. 말로만 된 설명만으로 어떤 문제가 발생한 건지 알 수가 없네요. nowp 2019.12.11 11:43
  • mParkDataSetList = [plate_no, mDate, "0", "1", "0", "0", "2", "S", "1", "0", "", "", "0"] mResult = plate_no + 'S' self.search_lpr_dict[mResult] = [mParkDataSetList] 이 딕셔너리 새로 추가하는 부분에서 에러가 발생됩니다. 알 수 없는 사용자 2019.12.11 11:44
  • 질문을 수정해서 코드를 넣어주세요. 인덴트도 알수 없고. nowp 2019.12.11 11:45
  • 아, 죄송합니다. 지금 수정해서 올릴게요! 알 수 없는 사용자 2019.12.11 11:48
  • 다시 코드 부분을 추가해서 올렸습니다. 도움 부탁드리겠습니다. 알 수 없는 사용자 2019.12.11 11:53
  • 위 코드가 dictionary changed size during iteration 가 나나요? dictionary 에 대한 루프가 있어야 나올 에러같은데요. nowp 2019.12.11 12:03
  • 무슨 뜻인지 모르겠네요. 해당 딕셔너리에는 전처리 if 조건문에 해당할 때 해당 딕셔너리 변수에 추가하는 부분이에요. 상단 이미지는 직접 python 테스트로 해봤을 때 문제가 없었는데, 같은 형식으로 데이터를 추가했는데 해당 에러가 발생되니, 도통 원인을 모르겠습니다. 알 수 없는 사용자 2019.12.11 12:07

1 답변

  • 질문에서 말씀하신 에러를 발생하는 코드가 아니라서, 문제의 소지로 보이는 부분만 말씀드리겠습니다.

    >>> d = {}
    >>> l = [1,2,3]
    >>> d[1] = l
    >>> d
    {1: [1, 2, 3]}
    
    >>> l[1] = 10
    >>> d
    {1: [1, 10, 3]}
    
    >>> d[1] = l.copy()
    >>> d
    {1: [1, 10, 3]}
    >>> 
    

    딕셔너리의 밸류값으로 리스트 l을 지정하고, 이후에 l의 내용을 바꾸면, 딕셔너리 안의 내용도 같이 바뀝니다. 이런 이유 때문에, 딕셔너리에 데이터를 넣은 이후에 리스트가 바뀌면서 데이터가 안 들어간 것처럼 결과가 나오는 것 아닐까 추측합니다.

    이런 걸 방지하기위해서 위 예에서는 딕셔너리에 밸류를 지정할 때, 리스트를 copy 하여 지정하였습니다.

    • 아... 정말 이렇게 간단한 문제로 인해 몇일을 고생한 제 자신이 한탄스럽네요. 리스트에 copy()만 추가해서 딕셔너리에 추가하니 원하는 로직대로 진행됩니다. 정말 감사합니다 ! 알 수 없는 사용자 2019.12.11 12:54
    • 디버그모드로 돌려보면서 변수값들을 확인하는 방법도 배우세요. vscode, pycharm 모두 가능합니다. nowp 2019.12.11 13:31
    • pandas dataframe 을 사용하는 방법이 더 간결할 수도 있어보입니다. nowp 2019.12.11 13:33

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)