首页 > 解决方案 > 使用 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}}

标签: pythonloopsdictionarynestedkey

解决方案


您可以使用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}}

推荐阅读