2015-11-29 2 views
4

Я конвертирую длинный словарь недельных значений в ежемесячные значения.ValueError: не удалось преобразовать строку в float в словаре

Вот небольшой образец Dict:

weeklydic={'2007-10-21': '56', '2007-10-28': '58', '2011-07-10': '56', '2011-07-16': '56'} 

Я использую этот код, чтобы суммировать недельные значения одного и того же месяца:

monthlydic = {} 

for key in weeklydic: 
    k = key[0:7] 
    if (k in weeklydic): 
     monthlydic[k] += float(weeklydic[key]) 
    else: 
     monthlydic[k] = float(weeklydic[key]) 

В целом работает нормально, в этом небольшом образце он должен вернуться

monthlydic={'2007-10': '114', '2011-07': '112'} 

Однако в одном словаре, по-видимому, есть значение, которое я Nnot конвертировать плавать, так что я получаю это очень раздражает сообщение:

ValueError: could not convert string to float 

Мои вопросы:

а) Есть ли способ я могу отслеживать неправильный пункт словаря, чтобы лучше понять, что такое происходит?

b) Есть ли способ, которым я могу преобразовать этот оператор «if» в «инструкцию try» таким образом, чтобы он прошел какие-либо ошибки?

+0

Я просто запустил то, что вы разместили, и оно не возвращает то, что у вас есть в вашем образце. Во-первых, значения в вашем 'monhtlydic' являются строками ... В любом случае, я думаю, вы имели в виду' if k в monthdic: ' –

ответ

0

Пару sugestions только.

Сначала используйте параметр defaultdict, который сохраняет начальную проверку ключа. Во-вторых, конвертировать в float с try и возвращать None, если не float.

Всякий раз, когда ничего не встречается, сохраните это в списке.

from collections import defaultdict 

def convert_float(x): 
    try: 
     return float(x) 
    except: 
     return None 

monthlydic = defaultdict(float) 
problems = [] 

for key in weeklydic: 
    k = key[0:7] 
    val = convert_float(weeklydic[key]) 
    if val is not None: 
     monthlydic[k] += val 
    else: 
     problems.append((k, weeklydic[key])) 
+0

«defaultdict» хорош и сохраняет строку кода и возможные ошибки. Я предпочитаю другое решение, которое сообщает об исключении, которое было поймано, и это не забавно, когда вы столкнулись со списком «проблем», не понимая, к какому ключу они были брошены, или даже к тем исключениям, которые были фактически выбраны. В мае позже забыть также проверить список 'problems'. В зависимости от приложения может быть лучше, если исключение прекратит его, чем солдат с недопустимыми данными. – Galax

+0

Работал отлично Кевин, спасибо. Однако мне также нужно отслеживать, где находится проблематичный элемент. Есть идеи? – abutremutante

+0

Nevermind, проблемы с печатью – abutremutante

2
weekly_string = weeklydic[key] 
try: 
    weekly_float = float(weekly_string) 
except ValueError as e: 
    print('error={error}, key={key}, value="{value}"'.format(
      error=e, key=key, value=weekly_string)) 
    weekly_float = 0.0 

Вы должны сделать это один раз, а не для обеих ветвей вашей if: else:

+0

Я получаю это: не удалось преобразовать строку в float:," ". Вы знаете, что это значит? – abutremutante

+0

Это означает, что ваш словарь, вероятно, имеет плохую ценность в нем, что-то вроде: 'weeklydic = {'2007-10-21': '', ...}'. Чтобы помочь вам отлаживать, вы также можете распечатать «ключ» в этом блоке 'except'. – Galax

+0

Это означает, что значение представляет собой пробел '' ''. 'float (" ")' дает эту ошибку. –

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