python - 使用 for 循环在字典中创建内部键
问题描述
我正在使用 for 循环从表中创建字典。目标是使用 for 循环创建具有嵌套键值对的字典。
表格为文本格式 第一行是标题,如下所示:
AAA|BBB|CCC
zzz|100|xy
zzz|50|xy
xxx|200|xy
xxx|100|xy
zzz|300|xz
zzz|400|xz
xxx|200|xz
xxx|700|xz
要获得 AAA 的总数,(在 AAA:CCC 键值对中),代码是成功的:
dict = {}
with open('data.txt') as table:
table.readline()
for line in table:
(AAA, BBB, CCC) = line.split("|")
dict[AAA] = dict[AAA] + int(BBB) if AAA in dict else int(BBB)
输出符合预期:
{'zzz': 850, 'xxx': 1200}
下一步(也是我卡住的地方)是如何执行迭代以创建内部键,格式为
{'zzz':{xy:150, xz:700}, 'xxx':{xy:300, xz:900}}
这是我到目前为止所拥有的,但不明白如何将 insideKey 插入到这个字典中:
dict = {}
new_dict = {}
with open('data.txt') as table:
table.readline()
for line in table:
(AAA, BBB, CCC) = line.split("|")
dict[AAA] = dict[AAA] + (new_dict[CCC] + int(BBB)) if CCC in new_dict else int(BBB)
我知道我无法使用 + 添加 insideKey,但无法找到执行此操作的方法。
预期输出:
{'zzz':{xy:150, xz:700}, 'xxx':{xy:300, xz:900}}
解决方案
您可以使用setdefault()
来设置初始值。当您循环时,只需设置适当的默认值或get
用于获取内部值或零:
d = {}
with open('data.txt') as table:
next(table)
for line in table:
(AAA, BBB, CCC) = map(str.strip, line.split("|"))
outer = d.setdefault(AAA, {})
outer[CCC] = outer.get(CCC, 0) + int(BBB)
结果:
{'zzz': {'xy': 150, 'xz': 700}, 'xxx': {'xy': 300, 'xz': 900}}
推荐阅读
- c# - 使用正确加载的列表对象时接收到 LINQ 表达式 x 无法翻译错误
- javascript - 我正在尝试将多个图像下载为 zip 文件,但不幸的是出现错误 Loading 'phpOWyJmt.png' failed Loading meta information failed
- python - 我想将特定列保存到python中的新excel表中
- postgresql - TLS 加密的 PostgreSQL 连接不可能
- firebase - VueJS 和 Firebase - 以正确的方式导入 firebase 包
- c - 如何保存C程序输出?
- c++ - 挣扎于CreatWindow函数
- java - Selenium - Chromeoptions - JsonException
- icons - Inno Setup UninstallIcon 消失
- arrays - 数组或未定义或默认数组作为函数的参数