Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:不可破坏的类型错误_Python - Fatal编程技术网

python:不可破坏的类型错误

python:不可破坏的类型错误,python,Python,(我也试过drug.upper()不带括号) 以下是此功能的预览: data=medications_minimum3(data,[drug.upper()],1) 有人知道我做错了什么吗 我知道我调用此函数的方式肯定是错误的,因为我从不同的位置调用此函数,它工作正常: def medications_minimum3(c,drug_input,sample_cutoff): #return sample cut off for # medications/physician d=[]

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

以下是此功能的预览:

data=medications_minimum3(data,[drug.upper()],1)
有人知道我做错了什么吗

我知道我调用此函数的方式肯定是错误的,因为我从不同的位置调用此函数,它工作正常:

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)
您不会显示什么是
数据
,但显然,当您在其行中循环时,
行[11]
变成了一个
列表
。列表是可变对象,这意味着它们不能用作字典键。试图使用
行[11]
作为键会导致
defaultdict
抱怨它是一个可变的,即不可损坏的对象

最简单的修复方法是将
行[11]
列表更改为
元组。要么做

counter[row[11]]+=1
或者在将
数据
传递到
最小值3
之前在调用者中修复它。元组只是一个不可变的列表,所以它的行为与列表的行为完全相同,只是创建后您无法更改它

counter[tuple(row[11])] += 1
行[11]
不可损坏。这是一张单子。这正是(而且只是)错误消息的含义。您可能不喜欢它,但这是错误消息

这样做

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

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

正如吉姆·加里森(Jim Garrison)在评论中所说,没有明显的理由说明为什么要从
drug.upper()
(这意味着drug是一个字符串)中创建一个单元素列表

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


TypeError:unhabable type:'list'
通常表示您试图将列表用作散列参数(如访问字典)。我会在
计数器[row[11]]+=1
中查找错误——您确定
行[11]
的类型正确吗?在我看来,这可能是一个列表。

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


例如,如果您将
[c]
传递给函数而不是
c

那么您可能会遇到此错误。为什么在失败的调用中
[drug.upper()]
周围有方括号?而且它也没有在函数中使用,没有对drug的引用_input@jcubic:接得好。这可能意味着在这里发布的代码经过了大量编辑,变得毫无价值。对于像
readthefile080410.py
这样的文件名,我猜您没有使用版本控制。没有理由不现在就开始使用。看看你是否不相信我。@sdolan你在windows中为python推荐了哪种源代码管理?非常感谢你的帮助,正如问题中提到的,它是从不同的地方调用的,并且工作得很好。如果
c
包含元组,则函数工作正常。如果它包含列表,则函数失败。这完全取决于打电话的人通过什么。问题中提到的东西,是从不同的地方打过来的,工作正常,计数器是一个集合“问题中提到的东西”?什么<代码>计数器
是一个集合。对<代码>行[11]
是一个列表。这就是您的错误消息所说的。最好添加一些关于错误含义的解释,例如什么是可哈希的,什么是可哈希的,什么不是,为什么不是,等等
counter[tuple(row[11])]+=1
d= [ row for row in c if counter[tuple(row[11])]>=sample_cutoff ]