2017-12-21 21 views
1

OrderedDictには階層レベルに対応するキーと各レベルのコードリストが格納されており、各子レベルは親レベルのコードとの関係を持っています。階層的なデータトラバーサルとPythonでの表現

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

精神は、私はちょうどプログラミングをしていないのです。私は、このようなネストされた辞書やこれらのコードのツリー表現、のような前者は何かのような1つに、このフォームから取得しようとしています

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

各データ構造には、その親に関する情報が含まれています。ネストされた辞書を作成するための単純な実装であり、ここで、その後

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] 

# 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: {} 
#  } 
# } 
# } 

これが理由素朴な実装であるので、あなたは最初に与えられたコードの階層をマップする関数を記述することができます非常に冗長ですが、あなたはその論理を持っています。実際にはcode_order_dict全体を反復する必要はなく、最高レベルのコード値(葉code_order_dict[4])にのみ、辞書ツリー全体に関する情報が含まれているためです。

私は、Python 2.7でこのコードを実行したノートが、私はレベル6で、それはpythonの下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

のPython 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: {}}, 
}} 
関連する問題