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、それはノーオペレーションです。defaultdict代わりに使用してください:

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]KeyErrorキーの下に何もないので、を取得しますrow[3]

コードを置き換える必要があります

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

このため:

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

さらに、globalキーワードは関数内で使用され、変数がグローバル変数であることを示します。ここでそれについて読むことができます。グローバル変数を作成した関数以外の関数でグローバル変数を使用 すると、グローバルディクショナリを宣言する正しい方法はoldPriceCompRankDict = {}

関数は2行目からディクショナリへの追加を開始します。rows.next()これは、望ましい動作である場合は呼び出すため、それ以外の場合はそのメソッドを呼び出す必要がないためです。

これがお役に立てば幸いです。

于 2012-06-18T17:42:13.123 に答える