我一直得到一个TypeError'Range'对象不支持项目分配。我尝试稍微更改代码,如在范围之前添加iter(...),以及在范围之前的列表(...)。但是,它没有帮助,错误仍在继续。 这是代码:
def findAnchor(anchors, node):
start = node
while node != anchors[node]:
node = anchors[node]
anchors[start] = node
return node
def unionFindConnectedComponents(graph):
anchors = range(len(graph))
for node in iter(range(len(graph))):
for neighbor in graph[node]:
if neighbor < node:
continue
a1 = findAnchor(anchors, node)
a2 = findAnchor(anchors, neighbor)
if a1 < a2:
anchors[a2] = a1
elif a2 < a1:
anchors[a1] = a2
labels = [None]*len(graph)
current_label = 0
for node in range(len(graph)):
a = findAnchor(anchors, node)
if a == node:
labels[a] = current_label
current_label += 1
else:
labels[node] = labels[a]
return anchors, labels
现在TypeError位于anchors [start] = node的开头。并且node是来自第二个函数的给定参数,它表示iter中的节点(range(len(graph)))。我用iter和list尝试过,但都没有用。怎么办?
答案 0 :(得分:4)
anchors = range(len(graph))
在python 2中生成list
,以便您可以分配给它。
但是在python 3中,行为发生了变化。 range
成为一个懒惰的序列生成对象,它可以节省内存和数据。 CPU时间,因为它主要用于计算循环,它用于生成连续的实际list
是相当罕见的。
范围实际上是一个不可变的序列类型
,而不是一个函数
此类对象不支持切片分配([]
操作)
Quickfix:对range
对象强制迭代,你将得到一个可以使用切片赋值的对象:
anchors = list(range(len(graph)))