Python 使用for循环在字典中创建内部键
我正在使用for循环从表创建字典。目标是使用for循环创建具有嵌套键值对的字典 表格为文本格式,第一行为标题,如下所示:Python 使用for循环在字典中创建内部键,python,loops,dictionary,nested,key,Python,Loops,Dictionary,Nested,Key,我正在使用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={} 以open('data.txt')作为表: 表3.readline() 对于表中的行: (AAA、BB
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={}
以open('data.txt')作为表:
表3.readline()
对于表中的行:
(AAA、BBB、CCC)=行拆分(“|”)
如果dict else int(BBB)中的AAA,则dict[AAA]=dict[AAA]+int(BBB)
产出如预期:
{'zzz': 850, 'xxx': 1200}
下一步(也是我被卡住的地方)是如何执行迭代以创建格式为的内部键
{'zzz':{xy:150, xz:700}, 'xxx':{xy:300, xz:900}}
这是我到目前为止所掌握的,但我不明白如何将insideKey插入这本词典:
dict={}
new_dict={}
以open('data.txt')作为表:
表3.readline()
对于表中的行:
(AAA、BBB、CCC)=行拆分(“|”)
dict[AAA]=dict[AAA]+(新dict[CCC]+int(BBB))如果CCC在新dict else int(BBB)中
我知道我无法使用+添加insideKey,但无法找到一种方法
预期产出:
{'zzz':{xy:150, xz:700}, 'xxx':{xy:300, xz:900}}
可以使用设置初始值。循环时,只需设置适当的默认值或使用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}}
一个简单的建议:不要使用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包含:
{('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}
结果如下:
我使用了初级Python程序员可能不知道的三个技巧:比字符串或数字更复杂的字典键;异常处理;和元组解包。如果你还没有学会这些概念,你可能会发现它们非常有用
注意:如果您可以使用第三方软件包,那么Pandas DataFrames是完成此类工作的绝佳工具。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}}
'''
你想对重复的值做什么:
xxx | 200 | xy xxx | 100 | xy
应该是什么{xxx:{xy:?}}马克·迈耶:看起来N N想要对它们求和。马克,它应该加在一起,{xxx:{xy:300}。把它想象成xxx是一个苹果,200是数量,xy是凯文,那个买了这个数量的人。在下一个例子中,xxx-苹果,100个数量,也由Kevin(xy)购买。迈克说,xz将是另一个人。因此,我们的字典键和值将是{apple:{Kevin:300,Mike:900}}
。此时,全部进入:d=defaultdict(lambda:defaultdict(lambda:0))
跳过如果
全部,则打印({k:dict(v)表示k,v在dict(d.items())中)
删除内部默认dict。
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}}
'''