python中JSON文件的多级defaultdict

2024-10-02 20:35:30 发布

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

我刚从here学会了如何使用多级defaultdict。已经讨论了同一主题。不幸的是,我的项目使用JSON保存数据,当我从JSON文件加载数据时,defaultdict功能消失了。我试图寻找一个解决方案,但没有找到或理解任何解决方案。那么,我应该如何从JSON(或TOML)文件中读取n级dict并对其应用defaultdict功能呢

简单的我在下面草草写了一个关于这个问题的简化例子和一个基本的解决方案(对于这个特殊的3级案例)。 你有更好的/可以理解的/解释得很好的解决方案吗

谢谢朋友们

from collections import defaultdict
from pprint import pprint
import json

class DeepDict(defaultdict):
    """Multilevel defaultdict functionality
    this snippet is from: https://stackoverflow.com/a/53671579"""
    def __call__(self):
        return DeepDict(self.default_factory)

group = 1
item = 12
item2 = 13
parts = ['asd','fgh']
parts2 = ['asf','fgj']

partlist = DeepDict(DeepDict(list))
partlist[group][item].extend(parts)
partlist[group][item2].extend(parts2)
pprint(partlist) #1 correct multilevel defaultdict
with open('data.json', 'w') as fp:
    json.dump(partlist, fp, indent=4)

with open('data.json', 'r') as fp:
    temp = json.load(fp)
pprint(temp) #2 plain dict

part_import = DeepDict(DeepDict(list))
part_import.update(temp)
pprint(part_import) #3 old data in plain dict

part_import = DeepDict(DeepDict(list))
#recreate and populate data to multilevel defaultdict
for k in temp:
    for l in temp[k]:
        part_import[k][l] = temp[k][l]
pprint(part_import) #4 correct multilevel defaultdict

向控制台生成:

DeepDict(DeepDict(<class 'list'>, {}),
         {1: DeepDict(<class 'list'>,
                      {12: ['asd', 'fgh'],
                       13: ['asf', 'fgj']})})
{'1': {'12': ['asd', 'fgh'], '13': ['asf', 'fgj']}}
DeepDict(DeepDict(<class 'list'>, {}),
         {'1': {'12': ['asd', 'fgh'], '13': ['asf', 'fgj']}})
DeepDict(DeepDict(<class 'list'>, {}),
         {'1': DeepDict(<class 'list'>,
                        {'12': ['asd', 'fgh'],
                         '13': ['asf', 'fgj']})})

Tags: importjson解决方案templistclasspprintpart