kzen.dev
  • Questions
  • Tags
  • Utilisateurs
Notifications
Récompenses
Inscription
Une fois inscrit, vous serez informé des réponses et des commentaires à vos questions.
Connectez-vous
Si vous avez déjà un compte, connectez-vous pour vérifier les nouvelles notifications.
Il y aura des récompenses pour les questions, réponses et commentaires ajoutés.
Détails
Source
Editer
 Keenan
Keenan
Question

Python : TypeError : unhashable type : 'list&#39 ;

J'essaie de prendre un fichier qui ressemble à ceci "Aucun AAA x 111 AAB x 111 AAA x 112 AAC x 123 ...

Et utilisez 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 à obtenir 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.
74 2012-12-02T23:49:20+00:00 3
 Georgy
Georgy
Question modifiée 21 janvier 2019 в 9:28
Programmation
python
list
dictionary
typeerror
Cette question a 1 réponse en anglais, pour les lire connectez-vous à votre compte.
Solution / Réponse
 RocketDonkey
RocketDonkey
3 décembre 2012 в 12:01
2012-12-03T00:01:40+00:00
Détails
Source
Editer
#17879162

Comme indiqué par les autres réponses, l'erreur est due à k = list[0:j], où votre clé est convertie en liste. Une chose que vous pourriez essayer est de retravailler votre code pour tirer profit de la fonction split :

# Using with ensures that the file is properly closed when you're done
with open('filename.txt', 'rb') as f:
  d = {}
  # Here we use readlines() to split the file into a list where each element is a line
  for line in f.readlines():
    # Now we split the file on `x`, since the part before the x will be
    # the key and the part after the value
    line = line.split('x')
    # Take the line parts and strip out the spaces, assigning them to the variables
    # Once you get a bit more comfortable, this works as well:
    # key, value = [x.strip() for x in line] 
    key = line[0].strip()
    value = line[1].strip()
    # Now we check if the dictionary contains the key; if so, append the new value,
    # and if not, make a new list that contains the current value
    # (For future reference, this is a great place for a defaultdict :)
    if key in d:
      d[key].append(value)
    else:
      d[key] = [value]

print d
# {'AAA': ['111', '112'], 'AAC': ['123'], 'AAB': ['111']}

Notez que si vous utilisez Python 3.x, vous devrez faire un petit ajustement pour que cela fonctionne correctement. Si vous ouvrez le fichier avec rb, vous devrez utiliser line = line.split(b'x&#39 ;) (qui s'assure que vous divisez l'octet avec le bon type de chaîne). Vous pouvez également ouvrir le fichier en utilisant with open('filename.txt&#39 ;, 'rU&#39 ;) as f: (ou même with open('filename.txt&#39 ;, 'r&#39 ;) as f:) et cela devrait fonctionner correctement.

 RocketDonkey
RocketDonkey
Réponse modifiée 3 décembre 2012 в 12:53
43
0
Jesse  the Game
Jesse the Game
2 décembre 2012 в 11:52
2012-12-02T23:52:14+00:00
Détails
Source
Editer
#17879160

Vous essayez d'utiliser k (qui est une liste) comme clé pour d. Les listes sont mutables et ne peuvent pas être utilisées comme clés de dict.

De plus, vous n'initialiserez jamais les listes dans le dictionnaire, à cause de cette ligne :

if k not in d == False:

Qui devrait être :

if k not in d == True:

Ce qui devrait être en fait :

if k not in d:
Jesse  the Game
Jesse the Game
Réponse modifiée 2 décembre 2012 в 11:58
15
0
Andrew Clark
Andrew Clark
2 décembre 2012 в 11:55
2012-12-02T23:55:46+00:00
Détails
Source
Editer
#17879161

Le TypeError se produit parce que k est une liste, puisqu'il est créé en utilisant une tranche d'une autre liste avec la ligne k = list[0:j]. Cela devrait probablement être quelque chose comme "k = &#39 ; &#39 ;.join(list[0:j])`", de sorte que vous ayez une chaîne de caractères à la place.

En plus de cela, votre instruction " si " est incorrecte, comme l'a noté la réponse de Jesse, qui devrait lire " si k n'est pas dans d " ou " si ce n'est pas k dans d " (je préfère cette dernière option).

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

Notez que vous ne devriez pas non plus utiliser list ou file comme noms de variables, puisque vous allez masquer des 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:]))

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

0
0
Communautés apparentées 2
Python en français
Python en français
1 431 utilisateurs
Ouvrir telegram
Python 🇨🇵
Python 🇨🇵
117 utilisateurs
Un groupe de Python en français. @Linux_Fr
Ouvrir telegram
Ajouter une question
Catégories
Toutes
Technologie
Culture / Loisirs
Vie / Arts
Science
Professionnel
Entreprises
Utilisateurs
Tous
Nouveau
Populaire
1
Ilya Smirnov
Enregistré il y a 6 jours
2
Денис Васьков
Enregistré il y a 1 semaine
3
Dima Patrushev
Enregistré il y a 1 semaine
4
sirojidddin otaboyev
Enregistré il y a 2 semaines
5
Елена Гайдамамакинат
Enregistré il y a 2 semaines
BG
DA
DE
EL
ES
FR
ID
IT
JA
KO
LV
NL
PT
RO
RU
SL
TR
ZH
© kzen.dev 2023
Source
stackoverflow.com
sous licence cc by-sa 3.0 avec l'attribution