2012-06-18 123 views
1

我有了數整數和浮點數csv文件,附加到Python字典

"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]) 

我有無序的密鑰,我不認爲密鑰必須是有序的格式。我認爲任何事情都可能是關鍵。

+3

當你得到一個Python回溯時,請分享它,以便回答的人不必在你的代碼中尋找錯誤可能來自哪裏。 –

回答

4

無需放入global關鍵字,這是一個無操作。 使用defaultdict代替:

from collections import defaultdict 

oldPriceCompRankDict = defaultdict(list) 

正在發生的事情是,你永遠不定義任何鍵oldPriceCompRankDict,你只是希望他們能夠通過默認列表。 defaultdict類型給你一個這樣的詞典;當在oldPriceCompRankDict中尚未找到密鑰時,將使用新的list()實例作爲起始值而不是引發KeyError。

+0

我也通過oldPriceCompRankDict解決了這個問題[row [3]] = row [4]這是一個好習慣嗎? –

+1

@ Null-Hypothesis:在這種情況下,至少你正在爲你的代碼分配一個新的鍵/值,是的。如果這就是你想要的而不是列表的字典,那就好了。 :-) –

+0

謝謝,任何指針按值排序字典? –

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(),那麼它就可以,否則您不需要調用該方法。

希望這是有益的,快樂的編碼!