2010-08-04 88 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]是正确的类型吗?听起来,这可能是一个列表。