2010-08-04 4 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' 

Je reçois l'erreur ci-dessus sur cette ligne:python: erreur de type unhashable

data=medications_minimum3(data,[drug.upper()],1) 

(J'ai aussi essayé drug.upper() sans parenthèses)

Voici un aperçu de cette fonction:

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 

Est-ce que quelqu'un sait ce que je fais mal ici?

Je sais que ce doit être mauvais est la façon dont je fais appel à cette fonction, parce que j'appelle cette fonction à partir d'un emplacement différent et il fonctionne très bien:

d=medications_minimum3(c,drug_input,50) 

Merci beaucoup pour votre aide!

+0

Pourquoi avez-vous les crochets entourant '[drug.upper()]' dans l'appel défaillant? –

+1

Et il n'est pas non plus utilisé dans la fonction, il n'y a pas de référence à drug_input – jcubic

+0

@jcubic: Bonne prise. Cela signifie probablement que le code a été tellement modifié pour être publié ici qu'il ne vaut rien. –

Répondre

6

Je ne pense pas que la conversion en tuple soit la bonne réponse.Vous devez aller et regardez où vous appelez la fonction et assurez-vous que c est une liste de chaînes, ou ce que vous avez conçu cette fonction avec

Par exemple, vous pourriez obtenir cette erreur si vous avez passé [c] à la fonction au lieu de c

16
counter[row[11]]+=1 

Vous ne montrez pas ce que data est, mais apparemment quand vous boucle à travers ses lignes, row[11] tourne être un list. Les listes sont des objets mutables, ce qui signifie qu'ils ne peuvent pas être utilisés comme des clés de dictionnaire. Si vous tentez d'utiliser row[11] comme clé, le defaultdict se plaint qu'il s'agit d'un objet mutable, c'est-à-dire qui ne peut pas être nettoyé. La solution la plus simple consiste à remplacer row[11] par list par tuple. Soit en faisant

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

ou en le fixant à l'appelant avant de data est passé à medications_minimum3. Un tuple simplement une liste immuable, donc il se comporte exactement comme une liste, sauf que vous ne pouvez pas le changer une fois qu'il est créé.

+0

merci beaucoup pour votre aide, la chose est comme mentionné dans la question, il est appelé à partir d'un endroit différent et il fonctionne bien –

+0

Droit. Si 'c' contient des tuples alors la fonction fonctionne bien. S'il contient des listes, la fonction échoue. Tout dépend de ce que l'appelant passe po –

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

row[11] est non lavable. C'est une liste. C'est précisément (et seulement) ce que le message d'erreur signifie. Vous pourriez ne pas l'aimer, mais c'est le message d'erreur.

Est-ce que ce

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

De plus, simplifiez.

d= [ row for row in c if counter[tuple(row[11])]>=sample_cutoff ] 
+0

la chose est comme mentionné dans la question, il est appelé à partir d'un endroit différent et cela fonctionne bien, le compteur est une collection –

+0

"la chose est comme mentionné dans la question"? Quelle? 'counter' est une collection. Correct. 'row [11]' est une liste. C'est ce que dit votre message d'erreur. –

+0

c'est la mauvaise approche –

3

Comme Jim Garrison dit dans le commentaire, aucune raison évidente pour laquelle vous souhaitez faire une liste d'un élément de drug.upper() (ce qui implique la drogue est une chaîne).

Mais ce n'est pas votre erreur, car votre fonction medications_minimum3() n'utilise même pas le second argument (quelque chose que vous devriez corriger).

TypeError: unhashable type: 'list' signifie généralement que vous essayez d'utiliser une liste comme argument de hachage (comme pour accéder à un dictionnaire). Je cherche l'erreur dans counter[row[11]]+=1 - êtes-vous sûr que row[11] est du bon type? Cela me semble être une liste.