Python:TypeError:Unhashable Type:List

时间:2012-12-30 18:15:28

标签: python numpy

我有一个代码,它基本上测试框触摸中随机分布的圆圈中的哪些圆圈 - 触摸圆圈作为群集添加到字典中。运行此代码时,我不断收到TypeError:

leftedge = 0
rightedge = 1
result = []
color = {}
parent = {}
clusters = {}
number = 0

def bfs(vertices, neighbours, source) :

    global number
    number +=1
    clusters[number] = set()
    color[source] = 'g'
    q = []

    q.append(source)

    while q != [] :
        v = q.pop(0)


        for v2 in neighbours[v] :
            if color[v2] == 'w' :
                 color[v2] = 'g'
                 parent[v2] = v
                 q.append(v2)
            color[v] = 'b'
            clusters[number].add(v)


def createclusters(vertices, neighbours) :

    for v in vertices :
        color[v] = 'w'
        parent[v] = -1

    while 'w' in color.values() :
            for v in color.keys() :
                if color[v] == 'w' :
                    bfs(vertices, neighbours, v)


def overlap(c1,c2,r) :
    if ((c1[0]-c2[0])**2 +(c1[0]-c2[0])**2)**0.5 > 2*radius :
         return 0
    return 1

def findclusters(array, radius) :
    d={}

    for c1 in array :
        d[c1]=[]
        for c2 in array :
            if overlap(c1, c2, radius) :
            d[c1].append(c2)

    createclusters(array,d)

    for cluster in clusters.values() :
        l = [i[0] for i in cluster]
        left = right = False

        x = max(l) 
        if x + radius > rightedge :
            right = True
        x = min(l)
        if x - radius < leftedge :
            left = True

        result.append((cluster,left,right))



import numpy.random as nr

array = nr.uniform(size=(10,2)).tolist
radius = 0.1

findclusters(array, radius)

print(clusters)

print(result)

当我尝试运行它时,我收到此错误:

TypeError                                 Traceback (most recent call last)
/Users/annikamonari/<ipython-input-316-be6c65f2ce89> in <module>()
----> 1 findclusters(array,0.1)

/Users/annikamonari/<ipython-input-309-32f214b46080> in findclusters(array, radius)
      2     d={}
      3     for c1 in array:
----> 4         d[c1]=[]
      5         for c2 in array:
      6             if overlap(c1,c2,radius):

TypeError: unhashable type: 'list'

对于我的生活,无法弄清楚为什么。有人能想出来吗?

谢谢!

3 个答案:

答案 0 :(得分:4)

首先,你可能需要拨打.tolist()而不是离开parens。


此外,array是一个二维数组,这意味着当你做...

for c1 in array:
    d[c1]=[]

... c1是一个列表。列表是可变的,不是可清除类型(因为如果它们是,哈希可以随时根据内容更改而更改,并且基于哈希的数据结构不会设计为处理它)因此无法使用作为字典键。

如果希望使用一系列值作为字典键,则需要首先使它们变为不可变(并因此可以是可变的)。最简单的方法是转换为tuple

for c1 in array:
    d[tuple(c1)]=[]

然而,从阅读代码开始,似乎更像是你想要迭代第一个数组的索引,这意味着你可能想要类似......

for index, values in enumerate(array):
    d[index] = []
    for c2 in values:
        # ...

或类似。

答案 1 :(得分:2)

由于程序期望数组是2d可散列类型(2d元组)的列表,因此在将数组转换为该形式之前,最好在调用其上的任何函数之前。

temp = nr.uniform(size=(10,2)).tolist()

array = [tuple(i) for i in temp]

这应该以所需的格式创建输入。

答案 2 :(得分:0)

您实际上并没有在代码中调用tolist方法,只需传递函数本身。

添加()来调用它:

array = nr.uniform(size=(10,2)).tolist()

请注意,代码中的c2是两个数字的列表,它不是一个数字。