python - 分配字典键和值时出现 KeyError
问题描述
我最近开始学习 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)
解决方案
字典上的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
推荐阅读
- android - Kotlin:IT 和 THIS 关键字之间的区别
- php - simple_html_dom: 简单的用例 - 取回存储在 SQLite db 中的数据
- spring-boot - 我们可以在spring boot的GET请求中传递对象吗?
- cyclomatic-complexity - 如果在计算圈复杂度时控制流图包含多个开始和/或停止节点会发生什么
- symfony - api-platform/admin 在安装后抱怨缺少 json 文件
- ckeditor5 - ckeditor5的双向支持
- python - 如何使用 Keras Lambda 层进行切片?
- python-3.x - 如何将 QScrollerProperties 应用于 QScroller,以摆脱超调?
- swift - 如何处理`withUnsafeBytes`被弃用的警告?
- dicom - JPEG2000 丢失在 Python 3.7 中读取 DICOM