【问题标题】:Dictionary w nested dicts to list in specified order字典 w 嵌套字典以指定顺序列出
【发布时间】:2017-03-23 21:33:07
【问题描述】:

如果帖子看起来多余,请见谅。我浏览了一堆其他帖子,但似乎找不到我要找的东西——也许公元前我是一个尝试编写基本代码的 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'}]

【问题讨论】:

    标签: list python-3.x dictionary nested


    【解决方案1】:

    因此,可以通过列表理解进行一些简单的转换:

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

    【讨论】:

    • 太好了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多