web-dev-qa-db-fra.com

Python, TypeError: type inshashable: 'list'

je reçois l'erreur suivante dans mon programme: Traceback:

Traceback (most recent call last):
File "C:\Python33\Archive\PythonGrafos\Alpha.py", line 126, in <module>
menugrafos()
File "C:\Python33\Archive\PythonGrafos\Alpha.py", line 97, in menugrafos
zetta = Beta.caminhografo(grafo,va,vb)
File "C:\Python33\Archive\PythonGrafos\Beta.py", line 129, in caminhografo
if ([vo, a]) in vat == ([vo,vq]) in vat:
TypeError: unhashable type: 'list'

Le programme est conçu pour créer une liste de contiguïté qui fonctionne correctement, puis pour rechercher un chemin entre vertex va et vb. J'ai utilisé un dictionnaire de listes dans collection/defaultdict afin que je puisse correctement ajouter un sommet adjacent.

Le problème réside dans les clauses if après la création de la liste à la fin du programme. Je ne peux pas trouver un moyen d'utiliser correctement les clauses if avec le dict pour déterminer s'il existe un chemin valide entre sommet. Aussi grafo est une classe de graphes.

Voici le code:

class graph:
v = 0
a = 0
node = []

class vertex:
ta = []
adj = {}

def caminhografo(grafo, va, vb):
vat = defaultdict(list)
i = 0
a = 0
z = 0
vo = int(va)
vq = int(vb)
vz = int(va)
vw = int(vb)
x = len(grafo.node)
if vz < vw:
    for vz in range (vw+1):
        a = 0
        x = len(grafo.node)
        for a in range (x):
            if [int(vz),int(a)] in grafo.node:
                vat[vz].append(a)                   
if vz > vw:
    while vz > vw:
        a = 0
        x = len(grafo.node)
        for a in range (x):
            if[int(va),int(a)] in grafo.node:
                vat[vz].append(a)
        vz = vz - 1
a = 0
x = len(grafo.node)
print(vat)
for a in range (x):
   if ([vo, a]) in vat == ([vo,vq]) in vat:
       print("""
==============================================
           Existe Caminho
==============================================
""")
       break
   Elif ([vo,a]) in vat:
       vo = a
   else:           
       print("""
==============================================
         Não Existe Caminho
==============================================
    """)
       break

Merci pour toute aide.

44
Rex

Le problème est que vous ne pouvez pas utiliser list comme clé de dict, car les clés dict doivent être immuables. Utilisez un tuple à la place.

Ceci est une liste:

[x, y]

C'est un tuple:

(x, y)

Notez que dans la plupart des cas, ( et ) sont facultatifs, puisque , définit en réalité un tuple (tant qu'il n'est pas entouré de [] ou {}, ni utilisé en tant qu'argument de fonction).

Vous pourriez trouver la section sur les n-uplets dans le tutoriel Python } utile:

Bien que les tuples puissent sembler similaires aux listes, ils sont souvent utilisés dans différentes situations et à différentes fins. Les tuples sont immutable, et contiennent généralement une séquence hétérogène d’éléments accessible par décompression (voir plus loin dans cette section) ou par indexation (ou même par attribut dans le cas de namedtuples). Les listes sont modifiables et leurs éléments sont généralement homogènes et sont accessibles par itération sur la liste.

Et dans la section sur dictionnaires :

Contrairement aux séquences, indexées par une plage de nombres, les dictionnaires sont indexés par des clés, qui peuvent être n’importe quel type immuable; les chaînes et les nombres peuvent toujours être des clés. Les tuples peuvent être utilisés comme clés s'ils ne contiennent que des chaînes, des nombres ou des tuples; si un tuple contient un objet mutable directement ou indirectement, il ne peut pas être utilisé comme clé. Vous ne pouvez pas utiliser les listes comme clés, car les listes peuvent être modifiées sur place à l’aide d’affectations d’index, de tranches ou de méthodes telles que append () et extend ().


Si vous vous demandez ce que signifie le message d'erreur, il se plaint car il n'y a pas de fonction intégrée fonction de hachage pour les listes (à dessein), et les dictionnaires sont implémentés comme tables de hachage .

91
Brendan Long

Le hash () est une méthode python intégrée, utilisée pour renvoyer un numéro unique. Ceci peut être appliqué à tout objet défini par l'utilisateur qui ne sera pas modifié une fois initialisé. Cette propriété est principalement utilisée dans les clés de dictionnaire.

TypeError: unhashable type : 'list' signifie généralement que vous essayez d'utiliser une liste comme argument de hachage. Cela signifie que lorsque vous essayez de hacher un objet insupportable, une erreur est générée.

0
Rajesh