重建一个python字典

时间:2014-07-10 17:07:31

标签: python dictionary

我有一个python字典有3个嵌入层,如下所示(每层有很多键):

my_dict = {key1:{key2:{key3:some_value}}}

现在我想通过将key3作为第一层移动来重建字典。所以字典看起来像:

my_dict = {key3:{key1:{key2:some_value}}}

我知道使用3 for循环重建整个事物的愚蠢方法,比如

my_new_dict = {}
for key1 in my_dict.keys():
    for key2 in my_dict[key1].keys():
        for key3 in my_dict[key1][key2].keys():
            ### a bunch of code to check if the key already exists and
            ### to move values into the new dictionary from scratch

我想知道是否有更好的方法来做到这一点。或者字典不是表示这种数据结构的最佳方式。那么构建此类数据的更好方法是什么?我想进行重建,因为我想先做一些基于key3循环的计算,但是如果没有使用key1和key2首先使用原始字典循环,我就无法进入key3。

2 个答案:

答案 0 :(得分:1)

嗯,它并不是那么复杂,特别是对于defaultdict

from collections import defaultdict
tree = lambda: defaultdict(tree)
new_dict = tree()
for key1 in my_dict:
    for key2 in my_dict[key1]:
        for key3 in my_dict[key1][key2]:
            new_dict[key3][key1][key2] = my_dict[key1][key2][key3]

唯一的问题是,您现在已经离开了一堆默认设置,这些默认设置有错误的__repr__

答案 1 :(得分:0)

“一堆代码”实际上并不需要非常复杂。如果您使用dict.setdefault根据需要创建新的中间词典,那么所谓的复杂部分就变成了一个单行。我还建议迭代你的词典items,而不是用键索引它们:

result = {}
for key1, middle_dict in my_dict.items():
    for key2, inner_dict in middle_dict.items():
        for key3, value in inner_dict.items():
            result.setdefault(key3, {}).setdefault(key1, {})[key2] = value

如果您使用的是Python 2,则可能需要使用iteritems而不是items,因为它不会分配列表来保存所有值。在Python 3中,items返回一个不需要太多内存的可迭代“视图”对象。