我有一个csv文件,其中包含数字整数和浮点数,
"5",7.30124705657363,2,12,7.45176205440562
"18",6.83169608190656,5,11,7.18118108407457
"20",6.40446470770985,4,10,6.70549470337383
"3",5.37498781178147,17,9,5.9902122724706
"10",5.12954203598201,8,8,5.58108702947798
"9",3.93496153596789,7,7,4.35751055597501
我正在做一些算术,然后我试图将它们添加到字典中,但我收到了关键错误。这是我的代码,
global oldPriceCompRankDict
oldPriceCompRankDict = {}
def increaseQuantityByOne(self, fileLocation):
rows = csv.reader(open(fileLocation))
rows.next()
print "PricePercentage\t" + "OldQuantity\t" + "newQuantity\t" + "oldCompScore\t" + "newCompScore"
for row in rows:
newQuantity = float(row[2]) + 1.0
newCompetitiveScore = float(row[1]) + float(math.log(float(newQuantity), 100))
print row[1] + "\t", str(row[2])+"\t", str(newQuantity) + "\t", str(row[4]) + "\t", newCompetitiveScore
oldPriceCompRankDict[row[3]].append(row[4])
我有未订购的密钥,我认为密钥不一定是有序的格式。我认为任何事都可能是关键。
答案 0 :(得分:4)
无需输入global
关键字,这是一个无操作。
改为使用defaultdict
:
from collections import defaultdict
oldPriceCompRankDict = defaultdict(list)
发生的事情是你永远不会为oldPriceCompRankDict
定义任何键,你只是希望它们默认为列表。 defaultdict
类型为您提供了一个可以做到这一点的词典;如果在oldPriceCompRankDict
中找不到某个键,则新的list()
实例将用作起始值,而不是引发KeyError。
答案 1 :(得分:2)
Python字典类型没有append()
方法。你正在做的是基本上试图调用键append()
可访问的字典元素的row[3]
方法。您获得KeyError
,因为您在密钥row[3]
下没有任何内容。
您应该替换您的代码
oldPriceCompRankDict[row[3]].append(row[4])
为此:
oldPriceCompRankDict[row[3]] = row[4]
此外,global
关键字在函数内部用于表示变量是全局变量,您可以在此处阅读:Using global variables in a function other than the one that created them
因此,声明全局字典的正确方法只是oldPriceCompRankDict = {}
您的函数将从第二行开始添加到字典中,因为如果它是理想的行为,则调用rows.next()
然后就可以了,否则您不需要调用该方法。
希望这是有帮助的,快乐的编码!