【问题标题】:KeyError When Assigning Dictionary Keys and Values分配字典键和值时出现 KeyError
【发布时间】:2018-11-21 01:14:24
【问题描述】:

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

我的代码如下。我收到的错误是 'KeyError: 1' on line 29 result[days] = users。我想我明白发生了什么(有点 - 我猜它对我尝试将值分配给空字典的方式不满意?它似乎正在寻找整数 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)

【问题讨论】:

  • result[days] = users 行不会生成此错误,但result[days] += users 会。首先确保哪一行受到影响,最好在该行而不是行号上添加注释。

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


【解决方案1】:

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

【讨论】:

  • 这很好用。简单而优雅。我将研究该功能,以便了解它做得更好的地方。干杯。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    除了dicty.setdefault(key, val)if key in dicty 之外的选项包括:

    尝试/排除

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

    collections.defaultdict()

    使用collections.defaultdict()

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

    最后一行将酌情执行dicty[key] = valuedicty[key] += value 的效果(实际上它的作用是,如果找不到密钥,请在运行dicty[key] += value 之前运行dicty[key] = int() ...你会有因此,请小心将其用于*=)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2021-05-09
      相关资源
      最近更新 更多