我有一个代码,它基本上测试框触摸中随机分布的圆圈中的哪些圆圈 - 触摸圆圈作为群集添加到字典中。运行此代码时,我不断收到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'
对于我的生活,无法弄清楚为什么。有人能想出来吗?
谢谢!
答案 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是两个数字的列表,它不是一个数字。