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


71

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

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子句中。我找不到一种方法,可以将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

感谢您的协助。

Answers:


133

问题是您不能在list中将a用作键dict,因为dict键必须是不可变的。请改用元组。

这是一个列表:

[x, y]

这是一个元组:

(x, y)

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

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

尽管元组看起来类似于列表,但是它们通常用于不同的情况和不同的目的。元组是不可变的,并且通常包含异类元素序列,这些元素可以通过拆包(请参阅本节后面的内容)或索引(甚至在namedtuple的情况下通过属性)进行访问。列表是可变的,并且它们的元素通常是同类的,并且可以通过遍历列表来访问。

在字典部分中:

与用数字范围索引的序列不同,字典是用键索引的,键可以是任何不可变的类型。字符串和数字始终可以是键。如果元组仅包含字符串,数字或元组,则它们可用作键。如果元组直接或间接包含任何可变对象,则不能将其用作键。您不能将列表用作键,因为可以使用索引分配,切片分配或诸如append()和extend()之类的方法在适当位置修改列表。


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


元组是否被视为字典列表的一部分,还是键?因为程序完全点燃了if,就好像它们总是假的一样。
— Rex

@雷克斯我不明白你的问题。如果使用元组作为键,则它将像其他任何键一样成为键。(some, tuple) in some_dict应该工作,假设(some, tuple)实际上是中的关键some_dict。确保您实际添加了您认为已添加的密钥。如果您在理解解释器的工作方式时遇到困难,最好在解释器中使用简单的字典。
— 布伦丹·朗

那么元组将被当作键读取吗?如果我正在寻找(key1,element_in_key),它将无法正常工作?
— Rex

@Rex回答问题的最简单方法可能是尝试在Python解释器中进行操作。简短的版本是,如果你喜欢存储的关键,some_dict[key] = something话key in some_dict会是真的。密钥是什么都没有关系(只要它是可哈希的)。
— 布伦丹·朗

因此,通过使用列表字典,我无法通过if中的键获取列表值?在那种情况下,如果我在寻找可变变量,无论如何我的if永远不会成立。因此,最好使用另一种格式存储顶点的邻接关系。
— Rex
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.