我有一个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。
答案 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
返回一个不需要太多内存的可迭代“视图”对象。