1

我有一个包含数字整数和浮点数的 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])

我有未排序的密钥,我认为密钥不必采用有序格式。我认为任何事情都可能是关键。

4

2 回答 2

4

无需输入global关键字,它是无操作的。使用 adefaultdict代替:

from collections import defaultdict

oldPriceCompRankDict = defaultdict(list)

发生的事情是您从未为 定义任何键oldPriceCompRankDict,您只是希望它们默认为列表。该defaultdict类型为您提供了一个执行此操作的 dict;oldPriceCompRankDict当在新实例中尚未找到键时,list()将使用该键作为起始值,而不是引发 KeyError。

于 2012-06-18T17:10:36.893 回答
2

Python 字典类型没有append()方法。您所做的基本上是尝试调用append()可通过 key 访问的字典元素的方法row[3]。您得到 a 是KeyError因为您在 key 下没有任何内容row[3]

你应该替换你的代码

oldPriceCompRankDict[row[3]].append(row[4])

为了这:

oldPriceCompRankDict[row[3]] = row[4]

此外,global在函数内部使用关键字来指示变量是全局变量,您可以在此处阅读有关它的信息:在创建它们的函数之外的函数中使用全局变量, 因此声明全局字典的正确方法就是oldPriceCompRankDict = {}

您的函数将从第二行开始添加到字典中,因为rows.next()如果它是一种理想的行为,那么您调用它就可以了,否则您不需要调用该方法。

希望这对您有所帮助,祝您编码愉快!

于 2012-06-18T17:42:13.123 回答