为了账号安全,请及时绑定邮箱和手机立即绑定

Python,TypeError:不可哈希类型:'list'

Python,TypeError:不可哈希类型:'list'

慕姐4208626 2019-10-11 14:26:13
我在程序中收到以下错误:追溯: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()之类的方法在适当位置修改列表。


如果您想知道错误消息的含义,那是在抱怨,因为没有针对列表的内置哈希函数(通过设计),并且字典实现为哈希表。


查看完整回答
反对 回复 2019-10-11
  • 1 回答
  • 0 关注
  • 688 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信