2015-10-06 2 views
-3

У меня возникли проблемы с обновлением словарей в 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

Можете ли вы предоставить образец того, как должен выглядеть ваш словарь, пожалуйста? Кроме того, пожалуйста, покажите свой код для 'update_customer_dictionary' – idjaw

+1

, чтобы форматировать код как код, поэтому более читаемый. – shafeen

+0

Почему бы просто не перевести словарь, созданный' customer_dictionary', в качестве параметра 'update_customer_dictionary', а затем вернуть измененный словарь? –

ответ

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.

+0

Есть ли способ без использования try и except? –

+0

Да, вы можете сказать «if acct in cdictionary», но «попробуйте ... кроме» лучше. Python проверяет, находится ли ключ в словаре, независимо от того, выполняете ли вы это, так что выполнение теста явно ничего не добавляет и просто замедляет работу программы. Если вы собираетесь программировать на python, вам действительно должно быть удобно с 'try ... except'. Но, конечно, если вы только начинаете, вы не можете сразу это сделать. :-) – saulspatz

Смежные вопросы