2014-09-25 3 views
0
{255: 
    {255: 
     {1: 
      {2:{} 
      } 
     } 
    } 
}, 
{255: 
    {255: 
     {2: 
      {3:{} 
      } 
     } 
    } 
} 

내 사전 매우 복잡한 (위 그림보다 더 항목)병합이 매우 중첩 된 파이썬 사전

가 지금은

출력해야이 사전

을 병합 할 수 있습니다 :

{255: 
    {255: 
     {1: 
      {2:{} 
      } 
     }, 
     {2: 
      {3:{} 
     } 
    } 
} 

또한 가능한 최대 중첩은 레벨 5까지입니다.

+0

키 충돌이 발생합니까? 그렇다면 어떻게 해결해야합니까? 언제든지 사전에없는 값이 있습니까? 아니면 가장 안쪽에있는 항목이 항상 빈 사전입니까? – Blckknght

답변

2

언더우드 tood하지만, 이것에 대해 어떻게 :

def merge(a, b): 
    for x in b: 
     if x in a: 
      merge(a[x], b[x]) 
     else: 
      a[x] = b[x] 
    return a 
+0

나는 처음에는 다른 하나와 함께 하나의 dict을 갱신하면 같은 결과가 발생할 것이라고 생각했을 것이다. –

+0

아마도 재귀 적으로 병합하는 dicts에 대한이 대답이 도움이 될 것입니다. http://stackoverflow.com/questions/7204805/dictionaries-of-dictionaries-merge –

1

여기에 인수 값 중 하나를 소지품하지 않습니다 게오르그의 대답에 간단한 변화가있어 (이 오히려 기존 재사용하는 것보다 새로운 사전의 데이터의 복사본을 반환) :

import copy 

def merge(a, b, copy_a=True): 
    if copy_a: 
     a = copy.deepcopy(a) 
    for x in b: 
     if x in a: 
      merge(a[x], b[x], copy_a=False) 
     else: 
      a[x] = copy.deepcopy(b[x]) 
    return a 

여분의 인수는 아닌 재귀 호출의에 (그들은 이미 그때까지 복사 했으므로), 코드는 최초의 호출시에 최초의 사전을 복사하는 데 사용됩니다. 구현 세부 사항이며 다른 코드에서 호출 할 때 항상 기본값을 사용합니다.

+0

좋은 호출입니다. 나는 '병합'보다는 func'extend'를 호출해야합니다. – georg