对于我的生活,我不能弄清楚Python如何认为我的dynamic_rnn
在迭代期间正在改变大小。我已经尝试过几次重新编写代码,但无法弄清楚我将修改字典的位置。
概述:我正在开发一种层次聚类算法,我从我创建的图形中构建MST,然后删除弱于指定阈值的边缘。这一切似乎工作正常,但现在当我经历并计算dict
(列表列表)时,我遇到了这个非常奇怪的错误。以下是我的代码:
clusters
基本上,def compute_clusters(self):
""" wrapper function to compute clusters via DFS """
mst = self.mst
total_nodes = len(mst.keys())
visited = set()
for node in mst.keys():
if node not in visited:
self.clusters += self.cluster_dfs(mst, node, visited)
def cluster_dfs(self, mst, node, visited, cluster=[]):
""" creates clusters through dfs """
cluster.append(node)
if self.dfs_finished(mst, node, visited):
return cluster
for neighbor in self.mst[node].keys():
if neighbor not in visited:
visited.add(neighbor)
cluster.append(neighbor)
self.cluster_dfs(mst, neighbor, visited, cluster)
def dfs_finished(self, mst, node, visited):
for neighbor in self.mst[node].keys():
if neighbor not in visited:
return False
return True
是我的MST(defaultdict(dict))的副本,它将所有节点映射到它们的邻居:权重。
我认为一种简单的方法是从MST中的每个节点执行DFS,而DFS尚未触及该节点。通过这种逻辑,递归仅在访问该特定簇中的所有元素之后才返回。然后它进入下一个集群并执行DFS。
我的运行时错误是:
mst
有没有人看到我可能会意外修改Traceback (most recent call last):
File "cluster.py", line 91, in <module>
cluster.build_clusters()
File "cluster.py", line 25, in build_clusters
self.compute_clusters() # compute final clusters
File "cluster.py", line 66, in compute_clusters
for node in mst.keys():
RuntimeError: dictionary changed size during iteration
的地方?抱歉,如果这是一个愚蠢的错误 - 我有点累了。
答案 0 :(得分:4)
有没有人看到我可能会意外修改字典的地方?
鉴于mst
是defaultdict
,一个可能的嫌疑人是:
for neighbor in self.mst[node].keys():
因为这可以将node
添加到self.mst
。 如果这是问题,则会留下如何的问题;因为更多的上下文/ mst
设置可能有所帮助。
似乎就是这样,访问defaultdict的非现有密钥将添加密钥。 ....一个mcve ..
d = collections.defaultdict(int)
print(d)
keys = ['a','b','c']
for key in keys:
print(key, hex(d[key]))
print(d)
>>>
defaultdict(<class 'int'>, {})
a 0x0
b 0x0
c 0x0
defaultdict(<class 'int'>, {'a': 0, 'c': 0, 'b': 0})
>>>
答案 1 :(得分:2)
我猜错误就在这里:
for neighbor in self.mst[node].keys():
^^^^^^^^^
if neighbor not in visited:
self.cluster_dfs(mst, neighbor, visited, cluster)
^^^
mst[node]
有密钥neighbor
,但mst
本身不需要