我在程序中收到以下错误:追溯: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 menugrafoszetta = Beta.caminhografo(grafo,va,vb)File "C:\Python33\Archive\PythonGrafos\Beta.py", line 129, in caminhografoif ([vo, a]) in vat == ([vo,vq]) in vat:TypeError: unhashable type: 'list'该程序旨在做一个工作正常的邻接表,然后继续搜索顶点va和vb之间是否存在路径。我在collection / 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 回答
哈士奇WWW
TA贡献1799条经验 获得超6个赞
问题是您不能将a list用作键dict,因为dict键需要是不可变的。请改用元组。
这是一个列表:
[x, y]
这是一个元组:
(x, y)
请注意,在大多数情况下,(and )是可选的,因为,它实际上定义了一个元组(只要它不被[]or 包围{},或用作函数参数)。
您可能会发现Python教程中有关元组的部分非常有用:
尽管元组看起来类似于列表,但是它们通常用于不同的情况和不同的目的。元组是不可变的,并且通常包含异类元素序列,这些元素可以通过拆包(请参阅本节后面的内容)或索引(甚至在namedtuple的情况下通过属性)进行访问。列表是可变的,并且它们的元素通常是同类的,并且可以通过遍历列表来访问。
在字典部分中:
与用数字范围索引的序列不同,字典是用键索引的,键可以是任何不可变的类型。字符串和数字始终可以是键。如果元组仅包含字符串,数字或元组,则它们可用作键。如果元组直接或间接包含任何可变对象,则不能将其用作键。您不能将列表用作键,因为可以使用索引分配,切片分配或诸如append()和extend()之类的方法在适当位置修改列表。
如果您想知道错误消息的含义,那是在抱怨,因为没有针对列表的内置哈希函数(通过设计),并且字典实现为哈希表。
添加回答
举报
0/150
提交
取消