2012-04-11 3 views
9

동안 사전 변경된 크기는 내가 그것은 내가 '.' 아래 코드 splite를 썼다파이썬 RuntimeError에 : 반복

{ hello: 'world', foo: [{'bar': v1, 'name': v2}, {bar: v3}]} 

으로 확장되어야이

{hello: 'world', "foo.0.bar": v1, "foo.0.name": v2, "foo.1.bar": v3} 

처럼 obj와 한 새로운 추가, 이전 키를 제거 키가 포함되어있는 경우 '.'이 포함되지만 그 내용은 RuntimeError: dictionary changed size during iteration

def expand(obj): 
    for k in obj.keys(): 
     expandField(obj, k, v) 

def expandField(obj, f, v): 
    parts = f.split('.') 
    if(len(parts) == 1): 
     return 
    del obj[f] 
    for i in xrange(0, len(parts) - 1): 
     f = parts[i] 
     currobj = obj.get(f) 
     if (currobj == None): 
      nextf = parts[i + 1] 
      currobj = obj[f] = re.match(r'\d+', nextf) and [] or {} 
     obj = currobj 
    obj[len(parts) - 1] = v 

RuntimeError에 : obj.iteritems()에서 K, V에 대한메시지처럼 반복

+1

그리고 귀하의 질문은 무엇입니까? 오류가 명확하지 않습니까? –

+8

** 게시하기 전에 검색하십시오 ** - http://stackoverflow.com/search?q=RuntimeError%3A+dictionary+changed+size+during+iteration –

+0

[이 python 오류를 해결하는 방법? RuntimeError : 반복되는 동안 사전 크기가 변경됨] (http://stackoverflow.com/questions/2844837/how-to-fix-this-python-error-runtimeerror-dictionary-changed-size-during-itera) –

답변

20

동안 사전 변경된 크기는 말한다 : 당신의 중간에 expandField() 동안의 내부 OBJ에있는 항목의 수를 변경 확장에서이 항목을 반복합니다.

대신 원하는 양식의 새 사전을 만들거나 원하는대로 변경 내용을 기록한 다음 루프가 완료된 후에 변경하십시오.

+3

네, 새로운 사전은 갈 길입니다. 이것은 또한 재귀를 단순화합니다. –

3

다른 사전에서 사전의 구조 (제거/추가)를 변경하려는 경우 비슷한 문제가있었습니다.

필자의 경우에 나는 딕트의 deepcopy를 만들었습니다. 내 dictcopy의 deepcopy를 사용하여 필자는 필요한만큼 키를 반복하고 제거 할 수있었습니다. Deepcopy - PythonDoc

A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.

희망이 있습니다.

6

당신은 목록에서 키를 복사하고 후자, 예를 들어, 사용하여 딕셔너리를 반복 할 수는 :

def expand(obj): 
    keys = obj.keys() 
    for k in keys: 
     expandField(obj, k, v) 

나는 결과 동작이 예상되는 결과를 맞는 경우 분석 할 수 있습니다.

관련 문제