0

我有一个代码,它基本上测试了盒子触摸中随机分布的圆圈中的哪些圆圈 - 触摸圆圈作为簇添加到字典中。运行此代码时,我不断收到 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'

对于我的生活,无法弄清楚为什么。任何人都可以弄清楚吗?

谢谢!

4

3 回答 3

4

首先,您可能需要调用.tolist()而不是离开括号。


另外,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:
        # ...

或类似的。

于 2012-12-30T18:19:53.343 回答
2

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

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

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

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

于 2012-12-31T03:23:12.430 回答
0

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

添加 () 来调用它:

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

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

于 2012-12-30T18:22:53.367 回答