使用for循环在字典中创建内部键

2024-04-25 22:46:27 发布

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

我正在使用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密钥值对),代码成功:

^{pr2}$

产出如预期:

{'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}}

Tags: innewfor字典linetabledictxxx
3条回答

您可以使用^{}来设置初始值。循环时,只需设置适当的默认值或使用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)

结果:

^{pr2}$

一个简单的建议:不要将dict用作dictionary实例的名称,因为它也是dictionary的名称。Python允许您修改对内置名称的绑定。这是很强大的,但是如果您在之后还需要使用dict()构造函数,您将无法做到这一点。在

现在,回答你的问题。我认为您试图在太少的代码行中完成太多。写多行,明确的行来代替字典的作业是没有羞耻的。我还建议你通过建立一个更简单的字典作为中间步骤来重新组织这个问题。在

字典键可以是任何可以散列的不可变数据类型。它包括只包含不可变数据的元组。此程序按您想要的方式为您提供汇总数据,但并非完全按照您想要的方式组织:

dct = {}
with open('data.txt') as table:
    table.readline()
    for line in table:
        (AAA, BBB, CCC) = line.split("|")
        v = int(BBB)     # value
        k = (AAA, CCC)   # key
        try:
            dct[k] += v  # existing key
        except KeyError:
            dct[k] = v   # new key

此时,dct包含:

^{pr2}$

现在,使用第二个循环来创建一个新字典,按照您想要的方式重新组织。在

result = {}
for (k1, k2), v in dct.items():
    try:
        result[k1][k2] = v
    except KeyError:
        result[k1] = {k2 : v}

结果如下:

{'zzz': {'xy': 150, 'xz': 700}, 'xxx': {'xy': 300, 'xz': 900}}

我使用了三个初学者可能不知道的技巧:比字符串或数字更复杂的字典键;异常处理;和元组解包。如果你还没有学会这些概念,你可能会发现它们非常有用。在

注意:如果您可以使用第三方软件包,Pandas数据帧是完成这类工作的一个很好的工具。熊猫可能只有在你有很多数据处理要做的时候才值得。在

只是为了说明使用defaultdict。在

from collections import defaultdict

d = defaultdict(dict)

with open('f0714.txt', 'r') as table:
    next(table)
    for line in table:
        (AAA, BBB, CCC) = map(str.strip, line.split("|"))

        if CCC not in d[AAA]:
            d[AAA][CCC] = int(BBB)
        else:
            d[AAA][CCC] += int(BBB)

print(dict(d))

'''
{'zzz': {'xy': 150, 'xz': 700}, 'xxx': {'xy': 300, 'xz': 900}}
'''

相关问题 更多 >