167 votes

Comment surmonter l'erreur de type : unhashable type : 'list'.

J'essaie de prendre un fichier qui ressemble à ça :

AAA x 111
AAB x 111
AAA x 112
AAC x 123
...

Et utiliser un dictionnaire pour que la sortie ressemble à ceci

{AAA: ['111', '112'], AAB: ['111'], AAC: [123], ...}

Voici ce que j'ai essayé

file = open("filename.txt", "r") 
readline = file.readline().rstrip()
while readline!= "":
    list = []
    list = readline.split(" ")
    j = list.index("x")
    k = list[0:j]
    v = list[j + 1:]
    d = {}
    if k not in d == False:
        d[k] = []
    d[k].append(v)
    readline = file.readline().rstrip()

Je continue de recevoir un TypeError: unhashable type: 'list' . Je sais que les clés d'un dictionnaire ne peuvent pas être des listes mais j'essaie de faire de ma valeur une liste et non la clé. Je me demande si je n'ai pas fait une erreur quelque part.

0voto

Andrew Clark Points 77748

El TypeError se produit parce que k est une liste, puisqu'elle est créée en utilisant une tranche d'une autre liste avec la ligne k = list[0:j] . Cela devrait probablement être quelque chose comme k = ' '.join(list[0:j]) et vous avez donc une chaîne de caractères à la place.

En outre, votre if L'affirmation est incorrecte, comme l'indique la réponse de Jesse, qui devrait être la suivante if k not in d ou if not k in d (Je préfère cette dernière).

Vous effacez également votre dictionnaire à chaque itération puisque vous avez d = {} à l'intérieur de votre for boucle.

Notez que vous ne devriez pas non plus utiliser list ou file comme noms de variables, puisque vous allez masquer les builtins.

Voici comment je réécrirais votre code :

d = {}
with open("filename.txt", "r") as input_file:
    for line in input_file:
        fields = line.split()
        j = fields.index("x")
        k = " ".join(fields[:j])
        d.setdefault(k, []).append(" ".join(fields[j+1:]))

El dict.setdefault() ci-dessus remplace la méthode if k not in d logique de votre code.

-1voto

raton Points 234
    python 3.2

    with open("d://test.txt") as f:
              k=(((i.split("\n"))[0].rstrip()).split() for i in f.readlines())
              d={}
              for i,_,v in k:
                      d.setdefault(i,[]).append(v)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X