我有一个简单的嵌套字典,用dict格式表示带有节点,顶点和边权重的图形:
{node: {vertex: weight, ... } ...}
。
以下是我创建它的方式:
with open(file) as f:
__, __1 = next(f).split()
for line in f:
tail, head, weight = line.split()
g1[tail] = {}
g1[tail][head] = int(weight)
这段代码给了我想要的字典。但是,当我运行更多代码创建一个类似的嵌套字典以及访问此字典时,我遇到了一个错误。这是代码:
nodes = g1.keys()
distance = {}
for n in nodes:
distance[n] = {}
for k in nodes:
distance[n][k] = graph[n][k]
在这里的某个地方出现了这个错误:
distance[n][k] = graph[n][k]
KeyError: '344'
表示我还没有为'344'创建一个密钥,这就是这段代码试图做的事情。我想通过将每个节点n初始化为dict,然后我可以创建distance [n] [k]的条目。我尝试过使用默认的dicts - 结果是一样的。为什么?
答案 0 :(得分:2)
for n in nodes:
distance[n] = {}
完成此for-loop
后,n
等于nodes
中的最后一个值。
无法保证k
中的每个nodes
都存在graph[n][k]
:
for k in nodes:
distance[n][k] = graph[n][k]
nodes
都是尾巴,而不是头。所以k
正在迭代尾巴。然而,graph[n][k]
将k
置于预期的头部位置。
尾巴和头部不一定是可互换的,最后的尾部n
可能不会连接到其他所有尾部,k
。
如果您尝试distance
graph
的副本,请使用
import copy
distance = copy.deepcopy(graph)
答案 1 :(得分:1)
错误表示您无法分配到distance[n][k]
,但344
中没有graph[n]
。