Python, TypeError: tipo inestable: ‘lista’

Estoy recibiendo el siguiente error en mi progtwig: Traceback:

Traceback (most recent call last): File "C:\Python33\Archive\PythonGrafos\Alpha.py", line 126, in  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' 

El progtwig está diseñado para hacer una lista de adyacencia que funciona bien y luego proceder a buscar si hay una ruta entre el vértice v y vb. Utilicé un diccionario de listas en collection / defaultdict para poder anexar correctamente el vértice adyacente.

El problema está en las cláusulas if después de que la lista se crea al final del progtwig. No puedo encontrar una manera de usar correctamente las cláusulas if con el dict para encontrar si hay una ruta válida entre vértice. También el grafo es una clase gráfica.

Aquí está el código:

 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: 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 

Gracias por cualquier ayuda.

El problema es que no se puede usar una list como la clave en un dict , ya que las claves dict deben ser inmutables. Utilice una tupla en su lugar.

Esta es una lista:

 [x, y] 

Esta es una tupla:

 (x, y) 

Tenga en cuenta que en la mayoría de los casos, ( y ) son opcionales, ya que es lo que realmente define una tupla (siempre que no esté rodeada por [] o {} , o que se use como un argumento de función).

Puede encontrar útil la sección sobre tuplas en el tutorial de Python :

Aunque las tuplas pueden parecer similares a las listas, a menudo se usan en diferentes situaciones y para diferentes propósitos. Las tuplas son inmutables y, por lo general, contienen una secuencia heterogénea de elementos a los que se accede mediante el desempaquetado (consulte más adelante en esta sección) o la indexación (o incluso por atributo en el caso de las duplicadas). Las listas son mutables, y sus elementos generalmente son homogéneos y se accede a ellos iterando sobre la lista.

Y en la sección de diccionarios :

A diferencia de las secuencias, que se indexan por un rango de números, los diccionarios se indexan por claves, que pueden ser de cualquier tipo inmutable; cadenas y números siempre pueden ser claves. Las tuplas se pueden usar como claves si solo contienen cadenas, números o tuplas; Si una tupla contiene algún objeto mutable directa o indirectamente, no puede usarse como una clave. No puede usar las listas como claves , ya que las listas se pueden modificar in situ utilizando asignaciones de índice, asignaciones de división o métodos como agregar () y extender ().


En caso de que se esté preguntando qué significa el mensaje de error, se está quejando porque no hay una función hash incorporada para las listas (por diseño), y los diccionarios se implementan como tablas hash .

El hash () es un método de python incorporado, utilizado para devolver un número único. Esto se puede aplicar a cualquier objeto definido por el usuario que no se modificará una vez que se haya inicializado. Esta propiedad se utiliza principalmente en las claves del diccionario.

TypeError: unhashable type : ‘list’ generalmente significa que está intentando usar una lista como un argumento hash. Esto significa que cuando intenta hacer un hash de un objeto que no se puede lavar, se producirá un error.