85

我在我的程序中收到以下错误:回溯:

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

感谢您的任何帮助。

4

1 回答 1

153

问题是您不能使用 alist作为 a 中的键dict,因为dict键需要是不可变的。改为使用元组。

这是一个列表:

[x, y]

这是一个元组:

(x, y)

请注意,在大多数情况下,(and)是可选的,因为,它实际上定义了一个元组(只要它没有被[]or包围{},或者用作函数参数)。

您可能会发现Python 教程中有关元组的部分很有用:

尽管元组可能看起来类似于列表,但它们通常用于不同的情况和不同的目的。元组是不可变的,通常包含一个异构的元素序列,这些元素通过解包(见本节后面)或索引(或者在命名元组的情况下甚至通过属性)访问。列表是可变的,它们的元素通常是同质的,可以通过遍历列表来访问。

字典部分:

与由一系列数字索引的序列不同,字典由键索引,键可以是任何不可变类型;字符串和数字总是可以作为键。如果元组仅包含字符串、数字或元组,则元组可以用作键;如果元组直接或间接包含任何可变对象,则不能将其用作键。您不能将列表用作键,因为可以使用索引分配、切片分配或 append() 和 extend() 等方法就地修改列表。


如果您想知道错误消息的含义,它会抱怨,因为没有内置的列表哈希函数(按设计),并且字典被实现为哈希表

于 2013-10-15T00:33:22.233 回答