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

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

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

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

Python

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

Q&A

解決済

2回答

710閲覧

テキストファイルから座標を読み込む際に、先頭の要素だけ抜けてしまう問題

old.exe

総合スコア23

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2022/09/15 07:10

テキストファイルから座標を読み込むプログラムを作りました。このプログラムは以下のような仕事をします。

1.テキストファイルを読み込み、行を要素とするリストを作る
2.整形用の空白文字を取り除く
例)['','','1','','21','288']→['1','21','288']
3.strからfloat型に変換する。変換できなかったものはヘッダーと見なして削除する

以下、コードと対象のテキストファイルになります。テキストは長いので省略しています。

python

1def str2float(cities): 2 """ [[str,str],[str]] → [[float,float],[float]] """ 3 4 for i in range(len(cities)): 5 try: 6 for j in range(len(cities[i])): 7 cities[i][j] = float(cities[i][j]) 8 except: 9 print(f"I deleted {cities[0]}") 10 del cities[0] 11 continue 12 13 14def remove_blank(cities): 15 for i in range(len(cities)): 16 for j in range(len(cities[i])): 17 try: 18 cities[i].remove('') 19 except: 20 continue 21 if cities[-1] == ['EOF']: 22 del cities[-1] 23 24 25with open("ali535.tsp","r") as fin: 26 cities = [data.split(' ') for data in fin.read().splitlines()] 27 28 remove_blank(cities) 29 str2float(cities) 30 31 32print(cities,len(cities))

ali535.tsp(txt)

1NAME: ali535 2TYPE: TSP 3COMMENT: 535 Airports around the globe (Padberg/Rinaldi) 4DIMENSION: 535 5EDGE_WEIGHT_TYPE: GEO 6DISPLAY_DATA_TYPE: COORD_DISPLAY 7NODE_COORD_SECTION 81 36.49 7.49 92 57.06 9.51 103 30.22 48.14 114 5.15 -3.56 125 34.59 -106.37 13... 14... 15... 16532 -6.13 39.13 17533 47.28 8.33 18534 51.33 0.14 19535 24.58 91.53 20EOF

こちらのテキストはhttp://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/tsp/からダウンロードできます。
以下、実行結果になります。

I deleted ['NAME:', 'ali535'] I deleted ['TYPE:', 'TSP'] I deleted ['COMMENT:', '535', 'Airports', 'around', 'the', 'globe', '(Padberg/Rinaldi)'] I deleted ['DIMENSION:', '535'] I deleted ['EDGE_WEIGHT_TYPE:', 'GEO'] I deleted ['DISPLAY_DATA_TYPE:', 'COORD_DISPLAY'] I deleted ['NODE_COORD_SECTION'] I deleted ['1', '36.49', '7.49'] [[2.0, 57.06, 9.51], [3.0, 30.22, 48.14], [4.0, 5.15, -3.56], [5.0, 34.59, -106.37], [6.0, 57.12, -2.12], [7.0, 16.45, -99.45], [8.0, 5.36, -0.1], [9.0, 28.56, -13.36], ... ... ... [529.0, 44.06, 15.21], [530.0, 45.45, 16.04], [531.0, 41.4, -1.03], [532.0, -6.13, 39.13], [533.0, 47.28, 8.33], [534.0, 51.33, 0.14], [535.0, 24.58, 91.53]] 534

以上になります。解決方法などありましたら回答よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

for文でリストにアクセスしながらそのリストのメンバーを削除するのは筋が悪いです。
削除してしまうと、ループで次にアクセスする場所が想定のものでなくなる場合があります。

そういう場合は、始めに空のリストを用意して、条件に合うものだけリストに追加するということをするのがいいでしょう。


ちなみに、以下のところは意図しているのかどうかわかりませんが、おかしな処理です。

python

1 print(f"I deleted {cities[0]}") 2 del cities[0] 3 continue

このときチェックしているのはi番目の行のはずですが、かならず0番目を消しています。
削除しているので、詰ってしまうからこうしないとうまく動かなかったのかなと思っていますが、そうだとすると、正常に動かない原因を表わしています。

投稿2022/09/15 07:28

編集2022/09/15 08:14
TakaiY

総合スコア12726

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

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

old.exe

2022/09/15 09:19

回答ありがとうございます。空リストを用意して、ループ内のtryで型変換&空リストに追加、expectでデリートせずにコンティニューしてみます。
old.exe

2022/09/15 18:05

解決できました。改めて回答していただきありがとうございました。
guest

0

解決できたのでプログラムを共有します。

python

1def str2float(cities): 2 """ [[str,str],[str]] → [[float,float],[float]] """ 3 4 data = [[0]]*len(cities) 5 6 for i in range(len(cities)): 7 city = [0]*len(cities[i]) 8 data[i] = city 9 try: 10 for j in range(len(cities[i])): 11 data[i][j] = float(cities[i][j]) 12 except: 13 data[i]*=0 14 continue 15 16 data2 = list(filter(None,data)) 17 18 return data2 19 20 21def remove_blank(cities): 22 for i in range(len(cities)): 23 for j in range(len(cities[i])): 24 try: 25 cities[i].remove('') 26 except: 27 continue 28 29 30with open("ali535.tsp","r") as fin: 31 cities = [data.split(' ') for data in fin.read().splitlines()] 32 33 remove_blank(cities) 34 data = str2float(cities) 35 36 37print(data,len(data))

投稿2022/09/15 18:03

old.exe

総合スコア23

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問