2017-11-30 10 views
-1

CG 파이프 라인의 메뉴 생성을 자동화하려고합니다. 나는 많은 스크립트를 가지고 있으며 손으로 파이프 라인을 관리하는 것은 번거로워진다. 메뉴 항목의 계층 구조를 가질 각 모듈에 중첩 사전 변수를 넣고 싶습니다. 메뉴 작성기 스크립트에 메뉴 항목을 넣을 위치를 알려줍니다.중첩 된 사전을 추가하여 병합

dict_1 = { 
    'ROOT DIV A' : { 
     'Root Menu A': { 
      'SUB DIV A' : { 
       'Sub Menu A':{ 
        'command' : 'import commands', 
        'annotation' : 'some command' 
       } 
      } 
     } 
    } 
} 

dict_2 = { 
    'ROOT DIV A' : { 
     'Root Menu A': { 
      'SUB DIV A' : { 
       'Sub Menu B':{ 
        'command' : 'import commands', 
        'annotation' : 'some command' 
       } 
      } 
     } 
    } 
} 

dict_3 = { 
    'ROOT DIV A' : { 
     'Root Menu B':{ 
      'command' : 'import commands', 
      'annotation' : 'some command' 
     } 
    } 
} 

출력은 다음과 같을 것이다 :

기본적으로,과 같이 사전을 병합하는 방법을 알아내는 데 문제가 내가 업데이 트를 시도했습니다

result_dict = { 
    'ROOT DIV A' : { 
     'Root Menu A': { 
      'SUB DIV A' : { 
       'Sub Menu A':{ 
        'command' : 'import commands', 
        'annotation' : 'some command' 
       }, 
       'Sub Menu B':{ 
        'command' : 'import commands', 
        'annotation' : 'some command' 
       } 
      } 
     }, 
     'Root Menu B':{ 
      'command' : 'import commands', 
      'annotation' : 'some command' 
     } 
    } 
} 

을하지만 보인다 값을 덮어 씁니다. 여기서 재귀 함수 예제를 시도했지만 깊이 중첩 된 사전 (단 하나의 중첩)에 대한 예제는 찾지 못했습니다. 나는 하드 코딩 된 예제보다 더 동적 인 것을 원할 것이다. 나는 또한 이것이 가능한지 확신 할 수 없기 때문에이 방향을 계속 고민하고있다. 그래서 그것에 대한 확신이 도움이 될 것이다. 감사!

답변

1

이 기능을 사용해보십시오 :이 트릭을하는 것처럼

def merge_dicts(x, y):  
    for key in y: 
     if key in x: 
      if isinstance(x[key], dict) and isinstance(y[key], dict): 
       merge_dicts(x[key], y[key]) 
     else: 
      x[key] = y[key] 
    return x 

result_dict = merge_dicts(merge_dicts(dict_1, dict_2), dict_3) 
+0

보인다. 고맙습니다! –