2015-01-24 6 views
0

시뮬레이션 결과를 파싱하여 numpy 배열 인 모든 결과를 추출하려고합니다. 간단한 자료를 통해 시뮬레이션 할 때, 우리가 배열 값을 하나의 사전 얻을 수 있습니다 :중첩 된 배열을 사전 밖으로 가져 오기

{'material1': {'shellmaterial':array, 'corematerial':array}} 

의 깊이 :

{'material1':array, 'material2':array, ...} 

더 복잡한 물질 시뮬레이션에서를, 우리는 같은 중첩 된 사전으로 끝날 중첩은 임의입니다, 그리고 내가하고 싶은 것은 사용 가능한 모든 배열이 중첩에 의해 명명 된 사용자에게 반환되는 플롯을 만드는 것입니다. 예를 들어, 위의 구조는 다음과 같이 끝납니다 :

{'material1.shellmaterial' : array, 'material1.corematerial' : array} 

다음은 드롭 다운 메뉴에 넣습니다. 플롯에서 쉽게 볼 수 있습니다. 누구든지 임의로 중첩 된 사전을 반복하고 배열 유형 값만 위의 그림과 같이 을 반환하는 좋은 방법이 있습니까?

결과는 json 호환성을 위해이 방법으로 저장해야하므로이 문제를 피하기 위해 리팩토링을 할 수는 없습니다.

+0

http://en.wikipedia.org/wiki/Recursion – user3467349

+0

당신이 정교한 당신이 원하는 무엇입니까? IE는 어떻게 이것을 파이썬에서 할 수 있습니까? –

+0

한숨을 내 쉬게하는이 질문에 대해 뭐라 구요? –

답변

1

다음은 언어 처리를 위해 일부 의사 결정 트리에서 사용한 기능입니다. 원하는 것은 아니지만 기본 아이디어는 같습니다. 여기

def nodeMapForDict(d): 
    node_map = [] 
    node_path = [] 
    def nodeRecursiveMap(d, node_path): 
     for key, val in d.items(): 
      if type(val) is not dict: node_map.append(node_path + [key]) 
      if type(val) is dict: 
       nodeRecursiveMap(val, node_path + [key]) 
    nodeRecursiveMap(d, node_path) 
    return node_map 

및 사용 사례에 맞게해야 하나입니다

def flattenDict(d): 
    node_map = {} 
    node_path = [] 
    def nodeRecursiveMap(d, node_path): 
     for key, val in d.items(): 
      if type(val) is not dict: node_map['.'.join(node_path + [key])] = val 
      if type(val) is dict: 
       nodeRecursiveMap(val, node_path + [key]) 
    nodeRecursiveMap(d, node_path) 
    return node_map 

예 :

완성도를 들어
d= {'d': [1, 2, 3, 4], 'e': {'b': {'c': 1}}, 'a': {'b': 'c'}} 
In [49]: flattenDict(d) 
Out[49]: {'d': [1, 2, 3, 4], 'e.b.c': 1, 'a.b': 'c'} 
+0

감사합니다. 여기서부터 시작하겠습니다. –

+0

아마 타입 (val)이 배열이되어야한다는 두 번째 조건을 설명하기위한 것이 아닙니다. 우리의 결과에는 배열이 아닌 다른 값이 있습니다. 문자열이나 다른 무언가는 무시해도됩니다. 그러나 이것 이외에, 나는 이것이 효과가 있다고 생각합니다. 감사. 나는 기본 PC에서 멀리 떨어져 있으므로 다시 넣을 기회가 생기고 승인 된 것으로 표시됩니다. –

0

, 여기 당신이 필터링 할 수있는 형식 인수를 허용 대답이야 보유 할 값의 유형. 필자의 경우이 값은 배열 값일 뿐이지 만 이러한 동작은 json 파일의 결과 또는 특히 시뮬레이션 프로그램의 데이터를 파싱하는 데 매우 유용합니다. 예를 들어

def flattenDict(d, *types): 
    node_map = {} 
    node_path = [] 
    def nodeRecursiveMap(d, node_path): 
     for key, val in d.items(): 
      if type(val) in types: 
       node_map['.'.join(node_path + [key])] = val 
      if type(val) is dict: 
       nodeRecursiveMap(val, node_path + [key]) 
    nodeRecursiveMap(d, node_path) 
    return node_map 

만의 int 문자열을 유지하기 :

d= {'d': [1, 2, 3, 4], 'e': {'b': {'c': 1}}, 'a': {'b': 'c'}} 
In [1]: flattenDict(d, int, basestring) 
Out[2]: {'e.b.c': 1, 'a.b': 'c'}