「該当のソースコード」を提示されている CSV ファイルで実行すると,
ValueError: invalid literal for int() with base 10: ''
のエラーが生じました。
これは,空文字列(''
)を整数に変換しようとしたことが原因と考えられ,空文字列を特定の数値文字列に置換しておく必要がありますが,今回の目的に合わせて無限大を模した数値文字列 INF = '100000'
に置換することにしました。
記述例を下記に示します。
Python
1import csv
2
3def warshall_floyd(dist):
4 n = len(dist)
5 for k in range(n):
6 for i in range(n):
7 for j in range(n):
8 dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
9 return dist
10
11def read_distance_matrix_from_csv(filename):
12 with open(filename, 'r', newline='') as csvfile:
13 reader = csv.reader(csvfile)
14 return [row[1:] for i, row in enumerate(reader) if i > 0]
15
16file_name = 'sample.csv'
17INF = '100000'
18
19d_csv = read_distance_matrix_from_csv(file_name)
20d_str = [[INF if s == '' else s for s in row] for row in d_csv]
21d_int = [[int(s) for s in row] for row in d_str]
22
23for row in d_int:
24 print(row)
25# [0, 10, 100000, 100000, 100000]
26# [10, 0, 8, 21, 100000]
27# [100000, 8, 0, 100000, 100000]
28# [100000, 21, 100000, 0, 16]
29# [100000, 100000, 100000, 16, 0]
30
31result = warshall_floyd(d_int)
32
33for row in result:
34 print(row)
35# [0, 10, 18, 31, 47]
36# [10, 0, 8, 21, 37]
37# [18, 8, 0, 29, 45]
38# [31, 21, 29, 0, 16]
39# [47, 37, 45, 16, 0]
(追記)
結果を CSV ファイルに保存するコードを追記します。
なお,最初の2行はヘッダとインデックスを追加するためのものです。必要なければコメントアウト等をしてください。
Python
1result = [[i + 1 for i, _ in enumerate(result)]] + result
2result = [[i if i > 0 else ''] + row for i, row in enumerate(result)]
3
4with open('result_' + file_name, 'w', newline='') as csvfile:
5 writer = csv.writer(csvfile)
6 writer.writerows(result)
(追記2)
結果を CSV ファイルへ保存する部分も含めたコード全体を示します。
処理する 2000x2000 の CSV ファイルの「コピー」を作業フォルダに移動し,その名前を data_2000.csv
に変更してから実行してください。
Python
1import csv
2
3def warshall_floyd(dist):
4 n = len(dist)
5 for k in range(n):
6 # print(k)
7 for i in range(n):
8 for j in range(n):
9 dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
10 return dist
11
12def read_distance_matrix_from_csv(filename):
13 with open(filename, 'r', newline='') as csvfile:
14 reader = csv.reader(csvfile)
15 return [row[1:] for i, row in enumerate(reader) if i > 0]
16
17file_name = 'data_2000.csv'
18INF = '100000'
19
20d_csv = read_distance_matrix_from_csv(file_name)
21d_str = [[INF if s == '' else s for s in row] for row in d_csv]
22d_int = [[int(s) for s in row] for row in d_str]
23
24result = warshall_floyd(d_int)
25
26with open('result_' + file_name, 'w', newline='') as csvfile:
27 writer = csv.writer(csvfile)
28 writer.writerows(result)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/10/18 01:44
2023/10/18 15:49 編集
2023/10/19 13:48
2023/10/19 14:41
2023/10/19 14:51
2023/10/20 06:10
2023/10/20 15:24 編集