2013-12-21 4 views
0

파이썬에서 사전에 관한 질문이 있습니다. 파이썬 : 사전을 재귀 적으로 변경하기

는이 같은 사전이 있습니다

D = {'key1' : ['key3'], 'key2' : {}, 'key3' : ['key2']} 

을 그리고 내 목표는 모든 값은 다음과 같이 가능한 한 대체한다는 것이다 :

After first iteration: 
D = {'key1' : {'key3' : ['key2']}, 'key2' : {}, 'key3' : {'key2' : {}]} 

After second iteration: 
D = {'key1' : {'key3' : {'key2' : {}}}, 'key2' : {}, 'key3' : ['key2']} 

는 그렇게 할 수 있습니까?

나는 이런 식으로 뭔가 생각 :

for k in D.keys(): 
    try: 
     if D[k] in D.keys: 
      D[k] = D[D[k]] 
    except: 
     pass 

나는 그것이 정확하지 알고를하고 제대로 동작하지 않습니다. 아마 재귀 함수를 사용해야한다고 생각합니다. 사전의 값을 올바르게 업데이트하려면 어떻게해야합니까?

죄송합니다. 설명이 명확하지 않더라도 아이디어를 얻으시기 바랍니다.

감사합니다.

+1

이 왜 값은을 목록에? –

+0

값은 위에 설명한 것과 같습니다. 즉, 'key1'의 값은 'key3'요소가 하나 포함 된 목록이고 'key3'은 실제로 'key2'목록이있는 사전 키입니다. 그리고 나는 이것을 대체하고 싶습니다. 따라서 'key1'의 값은 [[ 'key2]가되어야하고 이것은 [[{}]이됩니다. 마지막으로 중첩 된 사전 (목록 없음) 만 갖고 싶습니다. 내 설명이 혼란 스럽다는 것을 알고 있지만, 일치하는지 여부와 상관없이 사전의 값을 키로 대체 할 수 있는지 생각하고있었습니다. – WonderMan

+0

마지막 딕셔너리는 값으로 중첩 된 사전을 포함해야합니다. – WonderMan

답변

1

당신은 d의 키 값이 처음으로, 이미 dict입니다 당신이 그 즉, 가장 얕은 부분을 교체하는 것이 있는지 확인해야합니다 :이 하지 재귀 것을

def fix_dict(d): 
    fixed = False 
    while not fixed: 
     fixed = True 
     for k, v in d.items(): 
      if isinstance(v, list) and isinstance(d[v[0]], dict): 
       fixed = False 
       d[k] = {v[0]: d[v[0]]} 

참고하지만, 변경하지 않을 패스가 될 때까지 반복되고, 중첩의 두 레이어에만 국한되지 않습니다.

0

할 수있는 더 좋은 방법이 당신에게 해결책을 줄 것이다,하지만 난 파이썬 프로그래머가 아니에요, 그래서이있을 수 있습니다 :

D = {'key1' : ['key3'], 'key2' : {}, 'key3' : ['key2']} 

def sub(D, d): 
    if isinstance(d, list) and d[0] in D: 
    d = {d[0] : sub(D, D[d[0]])} 
    return d 

for k in D.keys(): 
    D[k] = sub(D, D[k]) 

print D 

출력 :

{'key3': {'key2': {}}, 'key2': {}, 'key1': {'key3': {'key2': {}}}} 
+0

'E = D'는 두 변수 이름을 같은 객체에 묶습니다. 다른 것에 영향을 미치지 않고 하나를 변경하고 싶다면,'deepcopy'가 필요합니다 (값 자체가 변경 가능함). – jonrsharpe

+0

좋은 캐치. 어쨌든 E는 불필요하다고 생각합니다. – mgamba

관련 문제