所以我在python中更新词典时遇到了麻烦。这是字典的功能:
def customer_dictionary(balfilename):
d = {}
bafile = open(balfilename, 'r')
for line in bafile:
dic = line.split()
d[dic[1]] = [dic[0] , dic[2]]
return d
bafile.close()
现在我要做的是创建另一个看起来像的函数:
def update_customer_dictionary(cdictionary, transfilename):
transfile = open(transfilename. 'r')
for line in transfile:
act, trans = line.strip().split()
if act in dictionary:
cdictionary[act][1] += float(trans)
else:
cdictionary[act][2] = [act][2]
我似乎无法弄清楚如何使用这个新函数更新上一个函数中的字典。 cdictionary是以前的字典。
File 1:
139-28-4313 115 1056.30
706-02-6945 135 -99.06
595-74-5767 143 4289.07
972-87-1379 155 3300.26
814-50-7178 162 3571.94
632-72-6766 182 3516.77
699-77-2796 191 2565.29
File 2:
380 2932.48
192 -830.84
379 2338.82
249 3444.99
466 -88.33
466 2702.32
502 -414.31
554 881.21
答案 0 :(得分:0)
首先,在customer_dictionary
中,由于函数在此之前返回,因此永远不会执行行bafile.close()
。您应该反转最后两行的顺序,或者更好的是,使用with
上下文管理器。
其次,当您阅读余额文件时,您将所有内容都保留为字符串。对于帐户和社会安全号码,这是可以的,但您需要将余额转换为浮动。
d[dic[1]] = [dic[0] , float(dic[2])]
关于更新字典的问题,请执行
之类的操作def update_customer_dictionary(cdictionary, transfilename):
with open(transfilename) as fin:
for line in fin:
acct, trans = line.strip().split()
try:
cdictionary[acct][1] += float(trans)
except KeyError:
<Print appropriate error message>
我建议您查看collections.namedtuple.
如果您正确定义了相应的内容,则可以将cdictionary[acct][1]
更改为更清晰的cdictionary[acct].balance
。
此外,使用上面提到的浮点数时可能存在舍入问题。对于银行类型的应用程序,您可能需要考虑使用decimal
模块。