복붙노트

[PYTHON] 파이썬, TypeError : unshashable 타입 : 'list'

PYTHON

파이썬, TypeError : unshashable 타입 : 'list'

내 프로그램에서 다음과 같은 오류가 나타납니다. 역 추적:

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'

이 프로그램은 잘 작동하는 인접 목록을 작성한 다음 정점 VA와 VB 사이에 경로가 있는지 검색합니다. 인접한 정점을 올바르게 추가 할 수 있도록 collection / defaultdict에 사전 목록을 사용했습니다.

문제는 프로그램이 끝날 때 목록이 작성된 후 if 절에 있습니다. 나는 꼭지점 사이에 유효한 경로가 있는지 알아보기 위해 dict과 함께 if 절을 적절히 사용하는 방법을 찾을 수 없습니다. 또한 grafo는 그래프 클래스입니다.

다음은 코드입니다.

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

도움을 주셔서 감사합니다.

해결법

  1. ==============================

    1.문제는 dict 키가 불변 일 필요가 있기 때문에 dict에서 키를 목록으로 사용할 수 없다는 것입니다. 대신 튜플을 사용하십시오.

    문제는 dict 키가 불변 일 필요가 있기 때문에 dict에서 키를 목록으로 사용할 수 없다는 것입니다. 대신 튜플을 사용하십시오.

    이것은 목록입니다 :

    [x, y]
    

    이것은 튜플입니다.

    (x, y)
    

    대부분의 경우에, (와)는 선택적이다. 왜냐하면 실제로 튜플을 정의하는 것이기 때문에 ([] 나 {}에 의해 둘러싸이지 않거나 함수 인자로 사용되는 한).

    파이썬 튜토리얼에서 튜플에 관한 섹션이 유용하다는 것을 알 수있다.

    그리고 사전에 대한 섹션에서 :

    오류 메시지가 의미하는 것이 궁금한 경우 목록에 대한 해시 함수가 내장되어 있지 않으므로 (설계 상), 사전은 해시 테이블로 구현되기 때문에 불평합니다.

  2. from https://stackoverflow.com/questions/19371358/python-typeerror-unhashable-type-list by cc-by-sa and MIT license