我在程序中发现以下错误: 回溯:
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
感谢您的帮助。
答案 0 :(得分:96)
问题是您无法使用list
作为dict
中的密钥,因为dict
密钥需要是不可变的。改为使用元组。
这是一个清单:
[x, y]
这是一个元组:
(x, y)
请注意,在大多数情况下,(
和)
是可选的,因为,
实际上定义了一个元组(只要它不被[]
包围或者{}
,或用作函数参数。)
您可能会发现the section on tuples in the Python tutorial有用:
尽管元组看起来与列表类似,但它们通常用于不同的情况并用于不同的目的。元组是不可变的,并且通常包含异构的元素序列,这些元素可以通过解包(参见本节后面部分)或索引(甚至是在namedtuples的情况下通过属性)来访问。列表是可变的,它们的元素通常是同类的,可以通过遍历列表来访问。
在dictionaries的部分中:
与由一系列数字索引的序列不同,字典由键索引,键可以是任何不可变类型;字符串和数字总是键。 如果元组只包含字符串,数字或元组,则它们可以用作键;如果元组直接或间接包含任何可变对象,则不能将其用作键。您不能将列表用作键,因为可以使用索引赋值,切片赋值或append()和extend()等方法对列表进行修改。
如果您想知道错误消息的含义,它会抱怨,因为列表(按设计)没有内置hash function,字典实现为hash tables。