2017-03-23 16 views
0

冗長であると思われる場合は、申し訳ありません。私は他の投稿を見てきました。私は探しているものを見つけることができませんでした。おそらく私は基本的なコードを書こうとしているpython newbyです...指定された順序でリストするネストされたdicts辞書

サイズ:一部のキーは単一の値を持ち、他のキーは値としてネストされた辞書を持っています。

辞書をリスト(リスト項目としてネストされた値を含む)に変換したいのではなく、特定の順序で変換したいと考えています。例えば

d = {'E':{'e3': 'Zzz', 'e1':'Xxx', 'e2':'Yyy'}, 'D': {'d3': 'Vvv', 'd1':'Nnn', 'd2':'Kkk'}, 'U': 'Bbb'} 

と私はそれがこのようになりたいと思います:

order_list = ['U', 'D', 'E'] # given this order... 

final_L = ['U', 'Bbb', 'D', 'd1', 'Nnn', 'd2', 'Kkk', 'd3', 'Vvv', 'E', 'e1', 'Xxx', 'e2', 'Yyy', 'e3', 'Zzz'] 

私はメインキーが順番が、ネストされた値に分類することができます。ここで私はこれまで持っているものだ...

d = {'E':{'e3': 'Zzz', 'e1':'Xxx', 'e2':'Yyy'}, 'D': {'d3': 'Vvv', 'd1':'Nnn', 'd2':'Kkk'}, 'U': 'Bbb'} 

order_list = ['U', 'D', 'E'] 

temp_list = [] 



for x in order_list: 
    for key,value in d.items(): 
     if key == x: 
      temp_list.append([key,value]) 

final_L = [item for sublist in temp_list for item in sublist] 
print(final_L) 

私の現在の出力は次のようになります。

['U', 'Bbb', 'D', {'d1': 'Nnn', 'd2': 'Kkk', 'd3': 'Vvv'}, 'E', {'e1': 'Xxx', 'e3': 'Zzz', 'e2': 'Yyy'}] 

答えて

0

リスト内包で作るための簡単な変換のだからカップル:

>>> [(k, sorted(d[k].items()) if isinstance(d[k], dict) else d[k]) for k in 'UDE'] 
[('U', 'Bbb'), 
('D', [('d1', 'Nnn'), ('d2', 'Kkk'), ('d3', 'Vvv')]), 
('E', [('e1', 'Xxx'), ('e2', 'Yyy'), ('e3', 'Zzz')])] 

任意の深度リストを平坦化する必要があります。その方法を説明するpostがあります。

import collections 
def flatten(l): 
    for el in l: 
     if isinstance(el, collections.Iterable) and not isinstance(el, str): 
      yield from flatten(e) 
     else: 
      yield el 

>>> list(flatten((k, sorted(d[k].items()) if isinstance(d[k], dict) else d[k]) for k in 'UDE')) 
['U', 'Bbb', 'D', 'd1', 'Nnn', 'd2', 'Kkk', 'd3', 'Vvv', 'E', 'e1', 'Xxx', 'e2', 'Yyy', 'e3', 'Zzz'] 
+0

これは素晴らしいことです。ありがとう! – virgiliocyte

関連する問題