programing

Python, TypeError: 해시할 수 없는 유형: 'list'

topblog 2023. 5. 8. 21:48
반응형

Python, TypeError: 해시할 수 없는 유형: '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 사이에 경로가 있는지 검색을 계속합니다.저는 인접한 정점을 적절하게 추가하기 위해 컬렉션/기본 딕트 목록 사전을 사용했습니다.

문제는 프로그램 종료 시 목록이 생성된 후의 if 절에 있습니다.정점 사이에 유효한 경로가 있는지 확인하기 위해 if-clause를 딕트와 함께 적절하게 사용할 수 있는 방법을 찾을 수 없습니다.또한 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

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

문제는 당신이 사용할 수 없다는 것입니다.list…의 열쇠로서dict,부터dict키는 불변이어야 합니다.대신 튜플을 사용합니다.

다음은 목록입니다.

[x, y]

이것은 튜플입니다.

(x, y)

참고로 대부분의 경우,(그리고.)선택 사항입니다.,튜플을 실제로 정의하는 것입니다(태플에 둘러싸여 있지 않은 한).[]또는{}또는 함수 인수로 사용됨).

Python 튜토리얼의 튜플 섹션이 유용할 수 있습니다.

튜플이 목록과 비슷해 보일 수 있지만, 종종 다른 상황과 다른 목적으로 사용됩니다.튜플은 불변이며 일반적으로 압축 풀기(이 섹션의 뒷부분 참조) 또는 인덱싱(또는 명명된 튜플의 경우 속성으로)을 통해 액세스되는 이기종 요소 시퀀스를 포함합니다.목록은 가변적이며, 해당 요소는 일반적으로 동일하며 목록에서 반복하여 액세스합니다.

그리고 사전 섹션에서는 다음과 같이 설명합니다.

숫자 범위로 인덱싱되는 시퀀스와 달리 사전은 키로 인덱싱되며, 키는 모든 불변 유형일 수 있으며 문자열과 숫자는 항상 키일 수 있습니다.튜플에 문자열, 숫자 또는 튜플만 포함된 경우 튜플을 키로 사용할 수 있으며, 튜플에 직접 또는 간접적으로 변경 가능한 개체가 포함된 경우 튜플을 키로 사용할 수 없습니다. 인덱스 할당, 슬라이스 할당 또는 append() 및 extend()와 같은 메서드를 사용하여 목록을 수정할 수 있으므로 목록을 키로 사용할 없습니다.


오류 메시지가 무엇을 의미하는지 궁금할 경우 목록(설계상)에 대한 해시 함수가 내장되어 있지 않고 사전이 해시 테이블로 구현되어 있기 때문에 불만입니다.

언급URL : https://stackoverflow.com/questions/19371358/python-typeerror-unhashable-type-list

반응형