Подтвердить что ты не робот

Python, TypeError: unhashable type: 'list'

Я получаю следующую ошибку в моей программе: 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'

Программа предназначена для создания списка смежности, который отлично работает и затем выполняет поиск, если существует путь между вершинами va и vb. Я использовал словарь списков в коллекции /defaultdict, поэтому я могу правильно добавить соседнюю вершину.

Проблема заключается в предложениях if после создания списка в конце программы. Я не могу найти способ правильно использовать предложения if с dict, чтобы найти, существует ли допустимый путь между вершинами. Также 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

Спасибо за любую помощь.

4b9b3361

Ответ 1

Проблема заключается в том, что вы не можете использовать list как ключ в dict, так как клавиши dict должны быть неизменными. Вместо этого используйте кортеж.

Это список:

[x, y]

Это кортеж:

(x, y)

Обратите внимание, что в большинстве случаев ( и ) являются необязательными, так как , - это то, что на самом деле определяет кортеж (если он не окружен [] или {}), или используется как аргумент функции).

Вы можете найти раздел о кортежах в учебнике Python:

Хотя кортежи могут казаться похожими на списки, они часто используются в разных ситуациях и для разных целей. Кортежи неизменяемы и обычно содержат гетерогенную последовательность элементов, к которым осуществляется доступ через распаковку (см. Далее в этом разделе) или индексирование (или даже атрибут в случае namedtuples). Списки изменяются, и их элементы обычно однородны и к ним обращаются путем повторения списка.

И в разделе dictionaries:

В отличие от последовательностей, которые индексируются по диапазону чисел, словари индексируются ключами, которые могут быть любыми неизменяемыми типами; строки и числа всегда могут быть ключами. Кортежи могут использоваться как ключи, если они содержат только строки, числа или кортежи; если кортеж содержит любой измененный объект прямо или косвенно, он не может использоваться в качестве ключа. Вы не можете использовать списки как ключи, так как списки могут быть изменены на месте с помощью назначений индексов, назначений срезов или таких методов, как append() и extend().


В случае, если вам интересно, что означает сообщение об ошибке, оно жалуется, потому что нет встроенной хеш-функции для списков (по дизайну), и словари реализованы как хеш-таблицы.