KeyError при назначении словарных ключей и значений - PullRequest
0 голосов
/ 21 ноября 2018

Я недавно начал изучать Python, и я хотел написать скрипт для извлечения дня месяца из столбца CSV (в формате YYYY / DD / MM), а затем сравнивать пользователей сайта с днями месяца (и, возможно, неделями).месяца) как задача / учебное упражнение.Суть в том, что он извлекает информацию CSV, форматирует ее / конвертирует в целые числа и объединяет ее обратно в словарь, сравнивая дни 1-31 с количеством посетителей сайта.

Мой код приведен ниже.Я получаю сообщение об ошибке «KeyError: 1» в строке 29 result[days] = users.Я думаю, что понимаю, что происходит (вроде - я думаю, что меня не устраивает способ, которым я пытаюсь присвоить значения пустому словарю? Кажется, я искал целое число 1 в качестве ключа, но не нашел его?) но я не могу понять, что делать дальше.У меня около 2 недель на изучение Python, поэтому я надеюсь, что это не слишком глупый вопрос.Что я делаю неправильно?Как сделать столбцы с индексами [0] и [1] для users_by_day ключом и значением в моем словаре?

Примечание. Я изучаю и использую Python 3.

 import csv
 result = {}
 with open('analytics.csv') as csv_file:
     csv_reader = csv.reader(csv_file, delimiter=',')
     line_count = 0
     users_by_day = list(csv_reader)
     for row in users_by_day: #iterate through data

          day = row[0].split('/') #split date to extract day of month

         try: #skip unsplit cells

             day = day[1]
         except Exception as e:
             pass
         row[0] = day #set list column to extracted day value

 users_by_day = users_by_day[1:-1] #strip headers

 for row in users_by_day:
     days = None
     users = None

         days = int(row[0]) #set values to int for math
         users = int(row[1])

     if days is not None:
         if days in result: #trying to check for days in result
             result[days] = users #where key error occurs
         else:
             result[days] += users

 print(result)

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

в части else, если дни не в результате, уравнение, безусловно, вызовет ошибку, потому что оно использует ключ, который не дает выхода:

result[days] =result[days]+ users

, но вы действительно имеете в виду, как:

 if days is not None:
     if days not in result:     #if result doesn't have that day
         result[days] = users   #get the day and its value into result
     else:                      #if result already has the day value
         result[days] += users  #summary the value
0 голосов
/ 21 ноября 2018

Опции, кроме dicty.setdefault(key, val) и if key in dicty, включают в себя:

Попробуйте / исключите

try:
    dicty[key] += value
except KeyError:
    dicty[key] = value

collection.defaultdict ()

Использование collections.defaultdict():

dicty = defaultdict(int)
dicty[key] += value

Последняя строка будет выполнена с эффектом dicty[key] = value или dicty[key] += value в зависимости от ситуации (на самом деле, если ключ не найден, выполните dicty[key] = int()перед запуском dicty[key] += value ... вы должны быть осторожны, используя это для *= поэтому).

0 голосов
/ 21 ноября 2018

Вызов setdefault () для словарей отлично подходит для такого рода вещей и предпочтительнее конструкции if {thing} in {dict}.

Итак, следующий код:

if days in result:  # trying to check for days in result
    result[days] = users  # where key error occurs
else:
    result[days] += users

Может стать:

result.setdefault(days, 0)
result[days] += users
...