Rex*_*Rex 55 python python-3.x
我在程序中发现以下错误: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'
Run Code Online (Sandbox Code Playgroud)
该程序旨在做一个工作正常的邻接列表,然后继续搜索顶点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
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
Rei*_*ica 109
问题是你不能list在a中使用a 作为键dict,因为dict键需要是不可变的.改为使用元组.
这是一个清单:
[x, y]
Run Code Online (Sandbox Code Playgroud)
这是一个元组:
(x, y)
Run Code Online (Sandbox Code Playgroud)
请注意,在大多数情况下,(和)是可选的,因为,它实际上定义了一个元组(只要它没有被[]or 包围{},或者用作函数参数).
您可能会发现Python教程中有关元组的部分很有用:
尽管元组看起来与列表类似,但它们通常用于不同的情况并用于不同的目的.元组是不可变的,并且通常包含异构的元素序列,这些元素可以通过解包(参见本节后面部分)或索引(甚至是在namedtuples的情况下通过属性)来访问.列表是可变的,它们的元素通常是同类的,可以通过遍历列表来访问.
在词典部分:
与由一系列数字索引的序列不同,字典由键索引,键可以是任何不可变类型; 字符串和数字总是键.如果元组仅包含字符串,数字或元组,则它们可用作键; 如果元组直接或间接包含任何可变对象,则不能将其用作键.您不能将列表用作键,因为可以使用索引赋值,切片赋值或append()和extend()等方法对列表进行修改.
如果您想知道错误消息的含义,它会抱怨,因为列表没有内置的哈希函数(按设计),字典实现为哈希表.
| 归档时间: |
|
| 查看次数: |
214078 次 |
| 最近记录: |