List 字典w按指定顺序列出的嵌套字典

List 字典w按指定顺序列出的嵌套字典,list,python-3.x,dictionary,nested,List,Python 3.x,Dictionary,Nested,对不起,如果这篇文章看起来多余的话。我浏览了很多其他帖子,但似乎找不到我要找的东西——也许bc我是一个python新手,正在尝试编写基本代码 给定任意大小的字典:一些键有一个值,其他键有一个嵌套字典作为其值 我想将字典转换成一个列表(包括作为列表项的嵌套值),但要按照特定的顺序 例如: d = {'E':{'e3': 'Zzz', 'e1':'Xxx', 'e2':'Yyy'}, 'D': {'d3': 'Vvv', 'd1':'Nnn', 'd2':'Kkk'}, 'U': 'Bbb'} 我

对不起,如果这篇文章看起来多余的话。我浏览了很多其他帖子,但似乎找不到我要找的东西——也许bc我是一个python新手,正在尝试编写基本代码

给定任意大小的字典:一些键有一个值,其他键有一个嵌套字典作为其值

我想将字典转换成一个列表(包括作为列表项的嵌套值),但要按照特定的顺序

例如:

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'}]

因此,通过列表理解,有两个简单的转换:

>>> [(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')])]
现在,您只需要展平任意深度列表,下面是一个描述如何做到这一点的示例:

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']

太好了。谢谢