【问题标题】:how to change tuple key into multilevel dict如何将元组键更改为多级字典
【发布时间】:2021-11-26 14:48:11
【问题描述】:

我有一本看起来像这样的字典: d = {key1 : {(key2,key3) : value}, ...} 所以它是一个字典字典,在里面的字典中,键是元组。

我想得到一个三重嵌套字典: {key1:{key2:{key3:值},...}

我知道如何使用 2 个循环和一个条件:

new_d = {}
for key1, inside_dict in d.items():
    new_d[key1] = {}
    for (key2,key3), value in inside_dict.items():
        if key2 in new_d[key1].keys():
            new_d[key1][key2][key3] = value
        else:
            new_d[key1][key2] = {key3 : value}

编辑:key2 值不能保证是唯一的。这就是我添加条件的原因

对我来说,这感觉很不合时宜。 有没有更快和/或更短的方法来做到这一点?

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    您可以使用collections.defaultdict 任意嵌套字典的常用技巧:

    from collections import defaultdict
    
    tree = lambda: defaultdict(tree)  
    new_d = tree()
    
    for k1, dct in d.items():
        for (k2, k3), val in dct.items():
            new_d[k1][k2][k3] = val
    

    【讨论】:

    • 这很酷,不知道这个。谢谢!
    • 是的,我也喜欢这个。顺便说一句,您的原始版本可能会丢失一些 key3,因为您不更新,而是替换最里面的 dict。
    【解决方案2】:

    如果我正确理解了问题,对于这种情况,您可以将所有循环包装在 dict 理解中。这假设您的数据是唯一的:

    data = {"key1": {("key2", "key3"): "val"}}
    {k: {keys[0]: {keys[1]: val}} for k,v in data.items() for keys, val in v.items()}
    

    【讨论】:

    • 稍微编辑了我的问题 - key2 的值​​不是唯一的(只有元组组合)
    • 这取决于 key1 是唯一的,但似乎并非如此。无论如何,正确的通用解决方案是使用 defaultdict,但字典推导值得保留。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    相关资源
    最近更新 更多