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
Спасибо за любую помощь.
Ответы
Ответ 1
Проблема заключается в том, что вы не можете использовать list
как ключ в dict
, так как клавиши dict
должны быть неизменными. Вместо этого используйте кортеж.
Это список:
[x, y]
Это кортеж:
(x, y)
Обратите внимание, что в большинстве случаев (
и )
являются необязательными, так как ,
- это то, что на самом деле определяет кортеж (если он не окружен []
или {}
), или используется как аргумент функции).
Вы можете найти раздел о кортежах в учебнике Python:
Хотя кортежи могут казаться похожими на списки, они часто используются в разных ситуациях и для разных целей. Кортежи неизменяемы и обычно содержат гетерогенную последовательность элементов, к которым осуществляется доступ через распаковку (см. Далее в этом разделе) или индексирование (или даже атрибут в случае namedtuples). Списки изменяются, и их элементы обычно однородны и к ним обращаются путем повторения списка.
И в разделе dictionaries:
В отличие от последовательностей, которые индексируются по диапазону чисел, словари индексируются ключами, которые могут быть любыми неизменяемыми типами; строки и числа всегда могут быть ключами. Кортежи могут использоваться как ключи, если они содержат только строки, числа или кортежи; если кортеж содержит любой измененный объект прямо или косвенно, он не может использоваться в качестве ключа. Вы не можете использовать списки как ключи, так как списки могут быть изменены на месте с помощью назначений индексов, назначений срезов или таких методов, как append() и extend().
В случае, если вам интересно, что означает сообщение об ошибке, оно жалуется, потому что нет встроенной хеш-функции для списков (по дизайну), и словари реализованы как хеш-таблицы.