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

时间:2013-10-15 00:19:01

标签: python python-3.x

我在程序中发现以下错误: 回溯:

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:96)

问题是您无法使用list作为dict中的密钥,因为dict密钥需要是不可变的。改为使用元组。

这是一个清单:

[x, y]

这是一个元组:

(x, y)

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

您可能会发现the section on tuples in the Python tutorial有用:

  

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

dictionaries的部分中:

  

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


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