重建python字典

2024-06-09 06:28:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

^{pr2}$

我知道用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。在


Tags: theto方法innewfor字典my
2条回答

好吧,它不必那么复杂,尤其是对于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]

唯一的问题是,现在只剩下一堆defaultdict,它们有坏的__repr__

其实不需要很复杂的代码。如果根据需要使用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

如果您使用的是python2,您可能希望使用iteritems,而不是items,因为它不分配一个列表来保存所有值。在python3中,items返回一个不需要太多内存的iterable“view”对象。在

相关问题 更多 >