【问题标题】:KeyError when assigning values赋值时出现 KeyError
【发布时间】:2014-11-25 11:39:26
【问题描述】:

我正在尝试将 .csv 数据输入 python。

这是我的代码的样子:

import csv

revenue = {}

prices = []
for i in range(1,21):
    prices.append(i)
prices = tuple(prices) #convert to tuple to make immutable and faster   

with open("test.csv") as file_handle:
    file_reader = csv.reader(file_handle)
    file_handle.readline()
    file_handle.readline()  #skip first 2 lines due to column header titles
    for row in file_reader:
        revenue[prices] = row[1] #assign revenue at each price-point

print revenue

print revenue[10]

这是 .csv 数据的样子,或者我的输入。

0.01    1397371
0.02    1350610
0.03    1306431
0.04    1136959
0.05    1106950
0.06    1064727
0.07    1037497
0.08    1030768
0.09    976552
0.1     963091
0.11    949641
0.12    917551
0.13    884734
0.14    878675
0.15    775261
0.16    765643
0.17    756057
0.18    733458
0.19    723077
0.2     654178

第一列是价格,第二列是收入。因为我选择的价格总是相同的,我实际上忽略了数据,只是简单地创建了一个整数形式的价格列表,我将其转换为一个元组(因为我读到如果数据是不可变的,元组将处理得更快) .

问题:如果我打印收入[10],我想看到 963091。相反,我得到 KeyError: 20。

当我打印收入时,我希望打印所有价格和相关收入,相反,我打印了整个价目表,然后是列表中最后一个价格的最终收入值 (0.2),654178。

我是 python 新手,所以对于新手问题我深表歉意,我一直在阅读并试图解决这个问题,但我仍在苦苦挣扎 - 也欢迎任何关于我的方法的建议,我可以使用我提供的所有帮助可以得到。

提前致谢!

【问题讨论】:

  • revenue 是一个字典,它不包含值为 10 的键。根据您要查找的内容,您需要将收入定义为列表:revenue = [] 和以后使用revenue.append(row[1])
  • 当您使用10 时,Keyerror 怎么可能是20?从错误中添加实际的回溯
  • 您正在使用整个 prices 元组作为键。这只是您字典中的一个键
  • 也可能你应该看看相关问题reading two column csv as dict
  • 抱歉,Keyerror 是 10,这是一个错字。

标签: python excel python-2.7 csv


【解决方案1】:

KeyError 当您尝试通过不存在的键获取某个值时抛出。在您的情况下,在 for 循环中构造 revenue dict 时,您通过相同的键(即 prices 元组)分配每个新收入。

revenue[prices] = row[1]

然后您尝试通过不存在的键获取值。 要解决此问题,您需要将收入分配给 for 循环中价格元组的相应元素。

i = 0
for row in file_reader:
    revenue[prices[i]] = row[1] #assign revenue at each price-point
    i += 1

但要确保元组的长度不小于文件中的记录数!

此外,还有一种更短的方法来构造 prices 元组:

prices = tuple(range(1,21))

【讨论】:

    【解决方案2】:

    这是因为收入被声明为字典。当您访问字典中的元素时,您应该使用键而不是数字。 因此,在这种情况下,收入 [价格 [10]]。请注意,元组从 0 到 n 开始。 因此 price[10] 实际上是第 11 个元素

    您还传递了收入[价格] = 行[1] 会将整行传递给收入价格。

    【讨论】:

    • 我认为因为它是循环输入,它会将每个收入金额按顺序关联到相关价格(因为键的数量与值的数量相同)
    • 因为你在 for 循环中使用了收入 [价格] = 行 [1],你将把行 [1] 处的任何元素分配给具有关键价格的字典元素。也纠正我如果我错了,但 csv 文件中的值不应该用逗号分隔。
    【解决方案3】:

    revenue[prices] = row[1] 不是插入行的值(这是一个单项列表),而是使用元组本身。

    >>> revenue[prices] = ''
    >>> revenue
    {(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20): ''}
    

    with open("test.csv") as file_handle:
        file_reader = csv.reader(file_handle)
        file_handle.readline()
        file_handle.readline()  #skip first 2 lines due to column header titles
        for row in file_reader:
            revenue[int(float(row[0].split()[0]) * 100)] = row[0].split()[1] #assign revenue at each price-point
    

    要将行转换为价格和收入,取第一项(唯一),将其拆分为价格和收入,然后将小数价格转换为 int。

    【讨论】:

    • 感谢您的回复 Celeo,您对如何将值与每个键关联起来有什么建议,在这种情况下是价格?
    • 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 2016-03-18
    • 2021-11-24
    • 2021-02-18
    • 2013-05-05
    相关资源
    最近更新 更多