迭代期间字典大小已更改

时间:2016-11-30 19:16:29

标签: python dictionary runtime-error

对于我的生活,我不能弄清楚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 的地方?抱歉,如果这是一个愚蠢的错误 - 我有点累了。

2 个答案:

答案 0 :(得分:4)

  

有没有人看到我可能会意外修改字典的地方?

鉴于mstdefaultdict,一个可能的嫌疑人是:

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本身不需要