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

时间:2019-07-14 18:18:30

标签: python loops dictionary nested key

我正在使用for循环从表创建字典。目标是使用for循环创建具有嵌套键/值对的字典。

表为文本格式第一行是标题,看起来像这样:

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)

要获得AAA(在AAA:CCC键值对中)的总计,代码成功:

{'zzz': 850, 'xxx': 1200}

输出符合预期:

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

下一步(以及我遇到的问题)是如何执行迭代以创建内部密钥,格式为

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

我了解到我无法使用+添加一个innerKey,但是无法找到执行此操作的方法。

预期输出:

android:layout_height="140dp"

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

一个快速的建议:不要将'dict'用作字典 instance 的名称,因为它也是字典 class 的名称。 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 包含:

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

现在,使用第二个循环来创建新字典,重新组织所需的方式。

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

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

注意:如果可以使用第三方程序包,Pandas DataFrames是完成此类工作的好工具。如果您需要处理大量数据,熊猫可能只值得付出努力。

答案 2 :(得分:0)

仅说明如何使用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}}
'''