2017-06-23 9 views
-1

私はリストのリストをPythonで持っています。それらをより一貫性のある順序付き辞書に集めたいと思います。入れ子リスト(Python)を辞書にグループ化するにはどうすればいいですか?

データの形式は次のとおりです。

[ 
['1_1', '2_1', '3_1', '4_1'], 
['1_1', '2_1', '3_2', '4_1'], 
['1_1', '2_2', '3_1', '4_1'], 
['1_1', '2_2', '3_1', '4_2'], 
['1_1', '2_2', '3_1', '4_3'], 
['1_1', '2_2', '3_2', '4_1', '5_1'], 
['1_1', '2_2', '3_2', '4_2', '5_1'],  
['1_1', '2_2', '3_2', '4_2', '5_2'], 
and so on... 
] 

結局、私が取得するために探していますが、第一、第二の同じ項目のオフに基づいてリストと分類を通じて行進することにより、辞書構造のいくつかの並べ替えです、3番目などのレベルになります。

私はのようなコードでこれを試すためにgroupbyで遊んでてきた:これは最初のレベルのために動作しますが、私はのために構造を再帰する方法についてこだわっている

_map = OrderedDict() 
for key, group in groupby(big_list, lambda x: x[0]): 
    _map[key] = [l[1:] for l in group] 

次第に深いレベルで同じ種類のグループ化を行います。

ご迷惑をおかけして申し訳ございません。

EDIT:downvotesで判断すると、これは良い質問ではないと思いますか?あなたは本当にgroupby()を必要としない

{'1_1': {'2_1': {'3_1': {'4_1': {}}, '3_2': {'4_1': {}}}, 
     '2_2': {'3_1': {'4_1': {}, '4_2': {}, '4_3': {}}, 
       '3_2': {'4_1': {'5_1': {}}, 
         '4_2': {'5_1': {}, 
           '5_2': {}} 
         } 
       } 
     } 
} 
+6

期待される出力を提供していないので、それは言うのが難しいです... –

+0

あなたが何を意味するかはまったく分かりません。あなたがあなたがそれを説明したり、入力*と*出力の例を与えない限り、あなたのデータに見える構造は明確ではありません。 –

+0

あなたが持っているデータは、木のような構造でよりよく分類/セグメント化されるように感じます。あなたのツリールートは '1_1'になります。 2人の子供がいます: '2_1'と '2_2'など。新しいリストごとに、適切なブランチの下にノードを作成します。このように、データは階層的に分類されます。 –

答えて

1

:私は期待出力は私の説明から明らかだったが、明示的であることを、私はDelganのコードが生成するものにかなり類似した木を探していたと思いました。

これははるかに簡単です。データを繰り返し処理しながら辞書を繰り返し入力するだけです。

便宜のためにdict.setdefault()を使用することもできます。これにより、キーがすでにネストされた辞書に存在するかどうかを確認する必要がなくなります。

map_ = {} # Note the trailing instead of leading underscore here 

for sub_list in big_list: 
    dct = map_ 
    for item in sub_list: 
     # Retrieve existing sub dict, or create a new one 
     dct = dct.setdefault(item, {}) 

print(map_) 

実際にはtreeが作成されています。リーフ要素は空のディクショナリで、後で読み込むことができます。

+0

@StevenRumbalski私はあなたの声明を理解していません。このコードは、入力されたサブリストに応じて、任意の深度のグラフを作成します。出力は '{'1_1':{'2_2':{'3_1':{'4_3':{} ...}'と似ています。 – Delgan

+0

十分に公正です。私は私の反対を退ける。 –

関連する問題