List 字典w按指定顺序列出的嵌套字典
对不起,如果这篇文章看起来多余的话。我浏览了很多其他帖子,但似乎找不到我要找的东西——也许bc我是一个python新手,正在尝试编写基本代码 给定任意大小的字典:一些键有一个值,其他键有一个嵌套字典作为其值 我想将字典转换成一个列表(包括作为列表项的嵌套值),但要按照特定的顺序 例如: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'} 我
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']
太好了。谢谢