Python,TypeError:不可用类型:'list'

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()等方法对列表进行修改.


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