我正在使用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"
答案 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}}
'''