首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python:不可散列的类型错误

python:不可散列的类型错误
EN

Stack Overflow用户
提问于 2010-08-05 06:03:13
回答 4查看 113.3K关注 0票数 18
代码语言:javascript
运行
复制
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'

我在这一行得到了上面的错误:

代码语言:javascript
运行
复制
data=medications_minimum3(data,[drug.upper()],1)

(我也尝试过不带括号的drug.upper() )

下面是此函数的预览:

代码语言:javascript
运行
复制
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

有人知道我做错了什么吗?

我知道我调用这个函数的方式肯定是错误的,因为我从不同的位置调用这个函数,它工作得很好:

代码语言:javascript
运行
复制
d=medications_minimum3(c,drug_input,50)

非常感谢您的帮助!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-05 06:43:14

我不认为转换为元组是正确的答案。您需要查看调用函数的位置,并确保c是一个字符串列表,或者是您设计此函数要使用的任何内容

例如,如果将[c]而不是c传递给函数,则可能会出现此错误

票数 9
EN

Stack Overflow用户

发布于 2010-08-05 06:12:23

代码语言:javascript
运行
复制
counter[row[11]]+=1

您没有显示data是什么,但是很明显,当您遍历它的行时,row[11]变成了一个list。列表是可变对象,这意味着它们不能用作字典键。尝试使用row[11]作为键会导致defaultdict抱怨它是一个可变的,即不可散列的对象。

最简单的解决方法是将row[11]list更改为tuple。无论是通过做

代码语言:javascript
运行
复制
counter[tuple(row[11])] += 1

或者在将data传递给medications_minimum3之前在调用方中修复它。元组只是一个不可变的列表,所以它的行为与列表完全一样,只是一旦创建就不能改变它。

票数 16
EN

Stack Overflow用户

发布于 2010-08-05 06:20:15

正如Jim Garrison在评论中所说,没有明显的理由让你从drug.upper()中创建一个单元素列表(这意味着药物是一个字符串)。

但这不是您的错误,因为您的函数medications_minimum3()甚至没有使用第二个参数(这是您应该修复的)。

TypeError: unhashable type: 'list'通常意味着您试图使用列表作为散列参数(就像访问字典一样)。我会查找counter[row[11]]+=1中的错误--您确定row[11]的类型正确吗?听起来可能是个名单。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3410206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档