2

このキーエラーが何度も発生しますが、その方法がわかりません。for-in ステートメントを使用しているため、キーは確実に存在します。

def floydWarshall(inFile):
    graph = readGraph(inFile)
    print(graph) # = {'0': {'1': 28, '3': 33}, '2': {'3': 50}, '1': {'4': 44, '2': 10}, '3': {'4': 30}, '4': 999999999}
    nodes = graph.keys()
    print(nodes) # = dict_keys(['0', '2', '1', '3', '4'])

    distance = {}

    for n in nodes:
        distance[n] = {}

        for k in nodes:
        distance[n][k] = graph[n][k]

    for k in nodes:
        for i in nodes:
            for j in nodes:
                distance[i][j] = min (distance[i][j], distance[i][k] + distance[k][j])
    printSolution(distance)

エラー:

Traceback (most recent call last):
File "C:/Users/.../prob1.py", line 58, in floydWarshall
    distance[n][k] = graph[n][k]
KeyError: '2' 

キーエラーは、ノードで最初に発生したキーにあり、毎回変更されます

4

2 に答える 2

2

すべてのグラフ ノードが他のすべてのグラフ ノードに対してエッジを持っているわけではないため、kグラフ全体のすべてのノードを反復処理するgraph[n][k]と KeyError が発生します。

おそらく、次のようなものが必要です。

for n in nodes:
    distance[n] = {}

    for k in graph[n]: 
        distance[n][k] = graph[n][k]

または、エッジが存在しない場合に距離[n][k]をデフォルト値に設定する場合:

for n in nodes:
    distance[n] = {}

    for k in nodes: 
        distance[n][k] = graph[n].get(k, default_value)

default_value多くの場合、ノード間の距離は無限に設定されます

于 2015-03-04T00:43:48.907 に答える
0

これは私には予想される動作のように見えます。グラフ ディクショナリは完全な行列ではありません。たとえば、graph[1] にはキー 3 が含まれていません。

グラフ[n][m]にnからmへのエッジが含まれていない場合、デフォルトの無限値が必要なようです。これを行うには、明示的なチェックを入れるか、defaultdictを使用します。

于 2015-03-04T00:51:51.827 に答える