質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

596閲覧

list index out of rangeが直せない

old.exe

総合スコア23

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/09/26 16:02

お世話になります。巡回セールスマン問題の経路の距離を求めるプログラムを作っています。以下コードになります。testでは上手く計算できるのですが、経路を指定して計算させるとタイトルのエラーを吐きます。

python

1import random 2import math 3 4 5 6def read_tspfile(): 7 """ 8 tspファイルを読み込み、都市の座標(float型)を 9 [[都市番号,X,Y],[...],...] の形で返す 10 """ 11 def str2float(cities): 12 data = [[0]]*len(cities) 13 for i in range(len(cities)): 14 city = [0]*len(cities[i]) 15 data[i] = city 16 try: 17 for j in range(len(cities[i])): 18 data[i][j] = float(cities[i][j]) 19 except: 20 data[i]*=0 21 continue 22 data2 = list(filter(None,data)) 23 return data2 24 25 def remove_blank(cities): 26 for i in range(len(cities)): 27 for j in range(len(cities[i])): 28 try: 29 cities[i].remove('') 30 except: 31 continue 32 33 with open("a280.tsp","r") as fin: 34 data = [city.split(' ') for city in fin.read().splitlines()] 35 remove_blank(data) 36 cities_data = str2float(data) 37 return cities_data 38 39 40 41cities = [] # Cityオブジェクトを入れるリスト 42cities_data = read_tspfile() 43population =[] 44 45class City: 46 def __init__(self,num,X,Y): 47 self.num = num 48 self.X = X 49 self.Y = Y 50 51 52 53class Route: 54 def __init__(self): 55 self.distance = 0 56 self.citynums = random.sample(list(range(len(cities_data))), 57 len(cities_data)) 58 59 60 61 def calc_distance(self): 62 """ citynumsリストの各都市間の距離の総和を求める """ 63 self.distance = 0 64 for i,num in enumerate(self.citynums): 65 """ 66 1つ前の都市との距離を計算 67 i=0のとき、i-1は最後の都市(最後の都市からスタートへの距離) 68 """ 69 self.distance += math.dist((cities[num].X, 70 cities[num].Y), 71 (cities[self.citynums[i-1]].X, 72 cities[self.citynums[i-1]].Y)) 73 return self.distance 74 75 76# citiesに読み込んだ座標を持つCityオブジェクトを入れる 77for i in range(len(cities_data)): 78 cities.append(City(cities_data[i][0], 79 cities_data[i][1], 80 cities_data[i][2])) # num,X,Yの順 81 82 83test = Route() 84a280 = Route() 85a280.citynums = [1, 86 2, 87 242, 88 243, 89 244, 90 241, 91 240, 92 239, 93 238, 94 237, 95 236, 96 235, 97 234, 98 233, 99 232, 100 231, 101 246, 102 245, 103 247, 104 250, 105 251, 106 230, 107 229, 108 228, 109 227, 110 226, 111 225, 112 224, 113 223, 114 222, 115 221, 116 220, 117 219, 118 218, 119 217, 120 216, 121 215, 122 214, 123 213, 124 212, 125 211, 126 210, 127 207, 128 206, 129 205, 130 204, 131 203, 132 202, 133 201, 134 198, 135 197, 136 196, 137 195, 138 194, 139 193, 140 192, 141 191, 142 190, 143 189, 144 188, 145 187, 146 186, 147 185, 148 184, 149 183, 150 182, 151 181, 152 176, 153 180, 154 179, 155 150, 156 178, 157 177, 158 151, 159 152, 160 156, 161 153, 162 155, 163 154, 164 129, 165 130, 166 131, 167 20, 168 21, 169 128, 170 127, 171 126, 172 125, 173 124, 174 123, 175 122, 176 121, 177 120, 178 119, 179 157, 180 158, 181 159, 182 160, 183 175, 184 161, 185 162, 186 163, 187 164, 188 165, 189 166, 190 167, 191 168, 192 169, 193 170, 194 172, 195 171, 196 173, 197 174, 198 107, 199 106, 200 105, 201 104, 202 103, 203 102, 204 101, 205 100, 206 99, 207 98, 208 97, 209 96, 210 95, 211 94, 212 93, 213 92, 214 91, 215 90, 216 89, 217 109, 218 108, 219 110, 220 111, 221 112, 222 88, 223 87, 224 113, 225 114, 226 115, 227 117, 228 116, 229 86, 230 85, 231 84, 232 83, 233 82, 234 81, 235 80, 236 79, 237 78, 238 77, 239 76, 240 75, 241 74, 242 73, 243 72, 244 71, 245 70, 246 69, 247 68, 248 67, 249 66, 250 65, 251 64, 252 58, 253 57, 254 56, 255 55, 256 54, 257 53, 258 52, 259 51, 260 50, 261 49, 262 48, 263 47, 264 46, 265 45, 266 44, 267 59, 268 63, 269 62, 270 118, 271 61, 272 60, 273 43, 274 42, 275 41, 276 40, 277 39, 278 38, 279 37, 280 36, 281 35, 282 34, 283 33, 284 32, 285 31, 286 30, 287 29, 288 28, 289 27, 290 26, 291 22, 292 25, 293 23, 294 24, 295 14, 296 15, 297 13, 298 12, 299 11, 300 10, 301 9, 302 8, 303 7, 304 6, 305 5, 306 4, 307 277, 308 276, 309 275, 310 274, 311 273, 312 272, 313 271, 314 16, 315 17, 316 18, 317 19, 318 132, 319 133, 320 134, 321 270, 322 269, 323 135, 324 136, 325 268, 326 267, 327 137, 328 138, 329 139, 330 149, 331 148, 332 147, 333 146, 334 145, 335 199, 336 200, 337 144, 338 143, 339 142, 340 141, 341 140, 342 266, 343 265, 344 264, 345 263, 346 262, 347 261, 348 260, 349 259, 350 258, 351 257, 352 254, 353 253, 354 208, 355 209, 356 252, 357 255, 358 256, 359 249, 360 248, 361 278, 362 279, 363 3, 364 280] 365print(len(test.citynums),test.citynums,test.calc_distance()) 366print(len(a280.citynums),a280.citynums) 367print(a280.calc_distance())

実行結果とエラー文です。

280 [249,..., 154] 31534.213588267176 280 [1, ..., 280] Traceback (most recent call last): line 369, in <module> print(a280.calc_distance()) line 73, in calc_distance (cities[self.citynums[i-1]].X, IndexError: list index out of range

以上になります。回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2022/09/26 16:34

a280.citynums の最後の要素が 280 なので、cities[self.citynums[-1]] で list index out of range が発生することになります。
shiracamus

2022/09/26 23:50 編集

print(len(cities)) で要素数がいくつあるか確認してみてください。
old.exe

2022/09/27 00:02

ありがとうございます。要素数は280でした。
shiracamus

2022/09/27 02:05 編集

280 なら、cities[280] は index out of range ですよ。 index の range は 0 ~ 279 です。
guest

回答1

0

ベストアンサー

元のソースでよさそうなので訂正します。

self.citynums = random.sample(list(range(len(cities_data))), len(cities_data))
では citiynum が 0 ~ 279 になりますが、
a280.citynums = [...] では 1 ~ 280 を代入しているのがおかしいのでは?

それと、data = [[0]]*len(cities) は良くないので data = [0]*len(cities) にしておきましょう。
参考: https://docs.python.org/ja/3/faq/programming.html#how-do-i-create-a-multidimensional-list

except での data[i]*=0data[i] = 0data[i] = None などにした方がいいでしょう。

投稿2022/09/27 03:48

編集2022/09/27 05:51
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

old.exe

2022/09/27 05:26

回答ありがとうございます。やってみましたがうまくいきませんでした。Routeオブジェクト作成時に生成される経路のリストと要素数は同じなのですが…。なんとか頑張ってみます。
shiracamus

2022/09/27 05:51 編集

元のソースでよさそうですね。 self.citynums = random.sample(list(range(len(cities_data))), len(cities_data)) では citiynum が 0 ~ 279 になりますが、 a280.citynums = [...] では 1 ~ 280 を代入しているのがおかしいのでは?
old.exe

2022/09/27 06:22

ここまでお付き合いいただきありがとうございました。map関数でcitynumsを-1したところ、解決できました。原因は読み込んだファイルの経路が1からスタート、ランダム生成される経路が0からスタートという点でした。改めて回答していただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問