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'我在这一行得到了上面的错误:
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)非常感谢您的帮助!
发布于 2010-08-05 06:43:14
我不认为转换为元组是正确的答案。您需要查看调用函数的位置,并确保c是一个字符串列表,或者是您设计此函数要使用的任何内容
例如,如果将[c]而不是c传递给函数,则可能会出现此错误
发布于 2010-08-05 06:12:23
counter[row[11]]+=1您没有显示data是什么,但是很明显,当您遍历它的行时,row[11]变成了一个list。列表是可变对象,这意味着它们不能用作字典键。尝试使用row[11]作为键会导致defaultdict抱怨它是一个可变的,即不可散列的对象。
最简单的解决方法是将row[11]从list更改为tuple。无论是通过做
counter[tuple(row[11])] += 1或者在将data传递给medications_minimum3之前在调用方中修复它。元组只是一个不可变的列表,所以它的行为与列表完全一样,只是一旦创建就不能改变它。
发布于 2010-08-05 06:20:15
正如Jim Garrison在评论中所说,没有明显的理由让你从drug.upper()中创建一个单元素列表(这意味着药物是一个字符串)。
但这不是您的错误,因为您的函数medications_minimum3()甚至没有使用第二个参数(这是您应该修复的)。
TypeError: unhashable type: 'list'通常意味着您试图使用列表作为散列参数(就像访问字典一样)。我会查找counter[row[11]]+=1中的错误--您确定row[11]的类型正确吗?听起来可能是个名单。
https://stackoverflow.com/questions/3410206
复制相似问题