Python, TypeError: unhashable type: 'liste'

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

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

Le programme est destiné à faire une liste de contiguïté qui fonctionne bien et ensuite procéder à la recherche s'il y a un chemin entre vertex va et vb. J'ai utilisé un dictionnaire de listes dans collection / defaultdict afin que je puisse ajouter correctement le Sommet adjacent.

Le problème est 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 trouver s'il y en a un chemin valide entre le Sommet. Grafo est également une classe de graphique.

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.

36
demandé sur Rex 2013-10-15 04:19:00

1 réponses

Le problème est que vous ne pouvez pas utiliser un list comme clé dans une dict depuis dict clés doivent être immuable. Utilisez un tuple à la place.

Ceci est une liste:

[x, y]

Ceci est un tuple:

(x, y)

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

Vous trouverez peut-être la section sur les tuples dans le tutoriel Python utile:

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

Et dans le section sur dictionnaires :

Contrairement aux séquences, qui sont 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 en place à l'aide de l'index affectations, affectations de tranches ou méthodes telles que append() et extend().


Au cas où vous vous demanderiez ce que signifie le message d'erreur, il se plaint car il n'y a pas de fonction de hachage intégrée pour les listes (par conception), et les dictionnaires sont implémentés comme tables de hachage.

80
répondu Brendan Long 2015-12-28 20:08:44