python:不可破坏的类型错误
(我也试过drug.upper()不带括号) 以下是此功能的预览: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=[]
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 ]