2017-12-21 25 views
1

계층 구조 코드는 계층 구조 수준 및 각 수준의 코드 목록에 해당하는 키를 사용하여 OrderedDict에 저장됩니다. 각 자식 수준은 부모 수준의 코드와의 관계가 있습니다.계층 적 데이터 탐색 및 파이썬 표현

codes_dict = { 
    11: { 
     111: { 
      1111: { 
       ... 
      }, 
      1112: { 
       ... 
      }, 
      1113: { 
       ... 
      }, 
      ... 
     }, 
     112: { 
      ... 
     }, 
    } 
} 

정신적으로 난 그냥 프로그래밍을하고 있지 않다 : 나는 그런 중첩 된 사전 또는 이러한 코드의 트리 표현, 같은 이전되는 무언가로 한이 양식에서 얻을 것을 시도하고

from collections import OrderedDict 

codes_ord_dict = OrderedDict([ 
    (2, [11]), 
    (3, [111, 112]), 
    (4, [1111, 1112, 1113, 1114, 1119, 1121, 1122, 1123, 1124, 1125, 1129]) 
]) 

횡단 연결 수준으로 끌어 올리려면 다음 단계로 이동하여 부모 코드를 따라 가서 내가 만든 방식으로 돌아가고 다음 코드로 이동하기 전에 자녀를 구성하십시오. 내가 만든 관계와 내가 가진 관계를 기록합니다 아니, 그래서 반복되지 않습니다. 실제로 나에게 주어진 답을 찾지는 못했지만이 문제에 접근하는 방법에 대한 몇 가지 전략이 있습니다. 그것은 해결책이 재귀를 포함하는 것처럼 보이지만 이전 수준과 다음 수준을 참조하도록 일부 상태를 유지해야합니다.

모든 안내를 받으실 수 있습니다.

답변

1

데이터 구조가 주어지면 각 코드에는 부모에 대한 정보가 포함됩니다. 그래서 먼저 주어진 코드의 계층 구조 매핑 함수 쓸 수있다 : 이것은 때문에 순진 구현

# create a dictionary to store results 

d = {} 

# iterate through code list in your ordered dict 

for code_list in codes_ord_dict.itervalues(): 

    # iterate through code in code list 

    for code in code_list: 

     # initiate new code 
     lvl = 0 
     parent = d 

     # get the code map 
     code_map = code_to_map(code) 

     # while the dictionary contains the key in the code map 
     # child is set as parent and level is incremented 

     while parent.has_key(code_map[lvl]): 

      parent = parent.get(code_map[lvl]) 

      lvl += 1 

     # Add the new dictionary as the code map does not exist 

     parent[code_map[lvl]] = {} 

print(d) 
# { 
# 11: { 
#  111: { 
#   1111: {}, 
#   1112: {}, 
#   1113: {}, 
#   1114: {}, 
#   1119: {} 
#  }, 
#  112: { 
#   1121: {}, 
#   1122: {}, 
#   1123: {}, 
#   1124: {}, 
#   1125: {}, 
#   1129: {} 
#  } 
# } 
# } 

: 다음

def code_to_map(code): 
    codestr = str(code) 
    codemap = [int(codestr[:i]) for i in range(2, len(codestr) + 1)] 
    return codemap 

print(code_to_map(1111)) 
# [11, 111, 1111] 

을, 여기에 중첩 된 사전을 만드는 순진 구현 매우 중복되지만 당신은 논리를 가지고 있습니다. 실제로 전체 code_order_dict을 반복 할 필요는 없지만 전체 사전 트리에 대한 정보가 포함되어 있으므로 최상위 코드 값 (사용자의 나뭇잎 code_order_dict[4])에서만 반복 할 필요가 없습니다.

내가 파이썬 2.7에서이 코드를 실행 참고하지만 6 레벨, 그것은 파이썬에서 Delforge의 대답 @

def code_to_map(code): 
    code_str = str(code) 
    code_map = [int(code_str[:i]) for i in range(2, len(code_str) + 1)] 
    return code_map 

d = {} 
for code_list in code_ord_dict.values(): 
    for code in code_list: 
     lvl = 0 
     parent = d 
     code_map = code_to_map(code) 
     while code_map[lvl] in parent: 
      parent = parent.get(code_map[lvl]) 
      lvl += 1 
     parent[code_map[lvl]] = {} 



from pprint import pprint 
pprint(d) 

출력 조각 3.

+0

@Delforge 감사합니다. 당신의 "순진 구현"은 깊이가 부모와 자식 노드에 따라 다르므로 더 큰 문제의 경우에 매우 적합합니다. 큰 문제는 6 번째 레벨에서 7 자리 코드로 6 개 레벨의 가능성을 갖지만 일부 모 노드에는 어린이/잎이 없습니다. 그래서 이것은 좋은 일입니다. 다른 사람들이 궁금해할만한 대답을 아래 Python 3 구현에 게시 할 것이다. 또한 문제를 6 레벨로 확장하고 출력의 스 니펫을 게시 할 것입니다. – Erik

0

파이썬 3 구현을 실행해야합니다 생각 (7 자리) 내선

{11: {111: {1111: {11111: {111110: {}}, 
        11112: {111120: {}}, 
        11113: {111130: {}}, 
        11114: {111140: {}}, 
        11115: {111150: {}}, 
        11116: {111160: {}}, 
        11119: {111191: {}, 111199: {}}}, 
      1112: {11121: {111211: {}, 111219: {}}}, 
      1113: {11131: {111310: {}}, 
        11132: {111320: {}}, 
        11133: {111331: {}, 
          111332: {}, 
          111333: {}, 
          111334: {}, 
          111335: {}, 
          111336: {}, 
          111339: {}}}, 
      1114: {11141: {111411: {}, 111419: {}}, 
        11142: {111421: {1114211: {}, 1114212: {}, 1114219: {}}, 
}}