我有一个字典,但是给定的条目可能不存在。例如,我有以下字典,缺少c
的条目:
g = {
'a': {'w': 14, 'x': 7, 'y': 9},
'b': {'w': 9, 'c': 6}, # <- c is not in dict
'w': {'a': 14, 'b': 9, 'y': 2},
'x': {'a': 7, 'y': 10, 'z': 15},
'y': {'a': 9, 'w': 2, 'x': 10, 'z': 11},
'z': {'b': 6, 'x': 15, 'y': 11}
}
我当前的代码
start = 'a'
end = 'z'
queue, seen = [(0, start, [])], set()
while True:
(distance, vertex, path) = heapq.heappop(queue)
if vertex not in seen:
path = path + [vertex]
seen.add(vertex)
if vertex == end:
print(distance, path)
break # new line, based on solutions below
# new line
if vertex not in graph: # new line
continue # new line
for (next_v, d) in graph[vertex].items():
heapq.heappush(queue, (distance + d, next_v, path))
现在我遇到了错误:
for (next_v, d) in graph[vertex].items():
KeyError: 'c'
编辑1
如果在字典中找不到密钥,请跳过
。编辑2
这次,即使使用新添加的代码,我仍然会出错:
(distance, vertex, path) = heapq.heappop(queue)
IndexError: index out of range
这是我使用的数据文件
https://s3-eu-west-1.amazonaws.com/citymapper-assets/citymapper-coding-test-graph.dat
这是文件格式:
<number of nodes>
<OSM id of node>
...
<OSM id of node>
<number of edges>
<from node OSM id> <to node OSM id> <length in meters>
...
<from node OSM id> <to node OSM id> <length in meters>
这是创建图形的代码
with open(filename, 'r') as reader:
num_nodes = int(reader.readline())
edges = []
for line in islice(reader, num_nodes + 1, None):
values = line.split()
values[2] = int(values[2])
edges.append(tuple(values))
graph = {k: dict(x[1:] for x in grp) for k, grp in groupby(sorted(edges), itemgetter(0))}
将start
和end
更改为:
start = '876500321'
end = '1524235806'
任何帮助/建议都将受到高度赞赏。 谢谢
答案 0 :(得分:1)
在访问graph[vertex]
之前,请确保它在字典中:
if vertex not in graph:
continue
for (next_v, d) in graph[vertex].items():
heapq.heappush(queue, (distance + d, next_v, path))
答案 1 :(得分:1)
您可以在执行最终的for循环之前检查顶点是否在图形中:
if vertex in graph:
for (next_v, d) in graph[vertex].items():
heapq.heappush(queue, (distance + d, next_v, path))
答案 2 :(得分:1)
您可以执行一个.get
并返回一个空的{}
,以防密钥不存在,以使.items()
不会损坏,
for (next_v, d) in graph.get(vertex, {}).items():
heapq.heappush(queue, (distance + d, next_v, path))