使用函数更新字典

时间:2015-10-06 00:43:48

标签: python dictionary

所以我在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 

1 个答案:

答案 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模块。