分配字典键和值时出现KeyError

时间:2018-11-21 01:14:25

标签: python python-3.x csv dictionary keyerror

我最近开始学习Python,我想编写一个脚本来从CSV列(格式为YYYY / DD / MM)中提取每月的某天,然后将网站用户与该天的某天(最后是几周)进行比较月)作为挑战/学习练习。要点是,它提取CSV信息,将其格式化/转换为整数,然后将其模糊化为字典,将第1到31天与网站访问者的数量进行比较。

我的代码如下。我收到的错误是第29 result[days] = users行上的'KeyError:1'。我想我了解发生了什么(有点-我猜这对我尝试将值分配给空字典的方式感到不满意?似乎是在寻找整数1作为键,但找不到它吗? ),但我不知道下一步该怎么做。我学习Python大约需要2周的时间,所以我希望这不是一个愚蠢的问题。我究竟做错了什么?如何使users_by_day的索引[0]和[1]处的列成为字典中的键和值?

注意:我正在学习和使用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 :(得分:2)

对字典的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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

order_item_namedicty.setdefault(key, val)以外的选项包括:

尝试/除外

if key in dicty

collections.defaultdict()

使用collections.defaultdict()

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

最后一行将在适当的情况下执行dicty = defaultdict(int) dicty[key] += value dicty[key] = value的效果(实际上,如果没有找到密钥,则在运行{{1}之前运行dicty[key] += value } ...因此,在dicty[key] = int()上使用时必须小心。