2010-08-04 123 views
13
Traceback (most recent call last): 
    File "<pyshell#80>", line 1, in <module> 
    do_work() 
    File "C:\pythonwork\readthefile080410.py", line 14, in do_work 
    populate_frequency5(e,data) 
    File "C:\pythonwork\readthefile080410.py", line 157, in populate_frequency5 
    data=medications_minimum3(data,[drug.upper()],1) 
    File "C:\pythonwork\readthefile080410.py", line 120, in medications_minimum3 
    counter[row[11]]+=1 
TypeError: unhashable type: 'list' 

我收到這條線上面的錯誤:蟒蛇:unhashable類型的錯誤

data=medications_minimum3(data,[drug.upper()],1) 

(我自己也嘗試drug.upper()不帶括號)

這裏是一個預覽此功能:

def medications_minimum3(c,drug_input,sample_cutoff): #return sample cut off for # medications/physician 
    d=[] 
    counter=collections.defaultdict(int) 
    for row in c: 
    counter[row[11]]+=1 
    for row in c: 
    if counter[row[11]]>=sample_cutoff: 
     d.append(row) 
    write_file(d,'/pythonwork/medications_minimum3.csv') 
    return d 

有沒有人知道我在做什麼錯在這裏?

我知道什麼是必須是錯的是我調用這個函數的方式,因爲我把從不同的位置,這個功能並能正常工作:

d=medications_minimum3(c,drug_input,50) 

非常感謝您的幫助!

+0

爲什麼在失敗的調用中''drug.upper()]'方括號? – 2010-08-04 22:10:13

+1

而且它也沒有在功能上使用,沒有提及drug_input – jcubic 2010-08-04 22:18:18

+0

@jcubic:很好。這可能意味着代碼已經被過多地編輯以便在這裏發佈以至於毫無價值。 – 2010-08-04 22:25:05

回答

6

我不認爲轉換爲元組是正確的答案。你需要去看看,你調用的函數,並確保c是字符串列表清單,或任何你設計了這個功能與

工作。例如,如果你通過[c]你可能會得到這個錯誤函數代替c

16
counter[row[11]]+=1 

你不顯示什麼data是,但顯然,當你通過它的行中循環,row[11]正在變成是一個list。列表是可變對象,這意味着它們不能用作字典鍵。嘗試使用row[11]作爲關鍵,導致defaultdict抱怨它是一個可變的,即不可更改的對象。

最簡單的修復方法是將row[11]list更改爲tuple。無論是通過做

counter[tuple(row[11])] += 1 

或之前data傳遞給medications_minimum3它在主叫固定。一個元組只是一個不可變列表,所以它的行爲與列表完全相同,除非創建後才能更改。

+0

非常感謝您的幫助,事情就像問題中提到的那樣,它被稱爲從不同的地方,它工作正常 – 2010-08-04 22:14:42

+0

沒錯。如果'c'包含元組,則該函數可以正常工作。如果它包含列表,則該功能失敗。這一切都取決於來電者通過什麼。 – 2010-08-04 22:17:23

0
File "C:\pythonwork\readthefile080410.py", line 120, in medications_minimum3 
    counter[row[11]]+=1 
TypeError: unhashable type: 'list' 

row[11]是難以置信的。這是一個列表。這正是(也是唯一)錯誤信息的含義。你可能不喜歡它,但那是錯誤信息。

做這個

counter[tuple(row[11])]+=1 

而且,簡化。

d= [ row for row in c if counter[tuple(row[11])]>=sample_cutoff ] 
+0

事情是在問題中提到的,它被稱爲從不同的地方,它工作正常,計數器是一個集合 – 2010-08-04 22:17:18

+0

「事情是在問題中提到」?什麼? 'counter'是一個集合。正確。 '行[11]'是一個列表。這就是你的錯誤信息所說的。 – 2010-08-04 22:37:18

+0

這是錯誤的方法 – 2010-08-04 23:05:23

3

吉姆駐軍的評論稱,沒有明顯的理由,爲什麼你會成爲一個一個元素列表出來的drug.upper()(這意味着藥物是一個字符串)。

但這不是你的錯誤,因爲你的函數medications_minimum3()甚至不使用第二個參數(你應該修復的東西)。

TypeError: unhashable type: 'list'通常意味着您嘗試使用列表作爲散列參數(就像訪問字典一樣)。我在counter[row[11]]+=1尋找錯誤 - 你確定row[11]是正確的類型嗎?聽起來,這可能是一個列表。