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

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

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

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

Python

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

Q&A

解決済

3回答

6368閲覧

Python:リストの中の座標同士の中点を計算していく

Ykkykk

総合スコア140

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/11/15 02:25

編集2018/11/15 02:44

リストに収められている座標同士の中点を計算し、二つの座標の間に挿入していきたいです。

Python3

1lst = [(1, 3), (2, 5), (2, 4) , (5, 4), (6, 9)] 2 3for i, k in enumerate(lst): 4 if i == 0: 5 pre = k 6 else: 7 x = k[0] - pre[0] 8 y = k[1] - pre[1] 9 midx = pre[0] + x / 2 10 midy = pre[1] + y / 2 11 lst.insert(i+1, (midx, midy)) 12 pre = k

以上のコードをコンソール上で打つと、最後の行を打ったあと、Python自体が止まってしまい、Ctrl+Cで終了しました。
止まってしまう原因もわからないのですが、リストに収められている座標同士の中点を計算し、それらの座標の間に新たに中点の座標を挿入していくという処理は、上記のような考え方で正しいのでしょうか?
ご教示いただけますと幸いです。よろしくお願いいたします。

修正

lstの中身でコンマが不足していたため修正いたしました。

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

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

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

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

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

hayataka2049

2018/11/15 02:37

(2, 4) (5, 4)の間のカンマが抜けてますね(入れれば期待通り動作する、ではなく、入れないと質問者と同じ「無限ループ」の状態にすらならないという指摘です)
Ykkykk

2018/11/15 02:44

ご指摘ありがとうございます。コピペする際に消してしまったようです。無限ループになるのですね。ありがとうございます。
guest

回答3

0

ベストアンサー

止まる原因

ループ対象のlstに挿入しているせいで、意図通り動いていません。

python

1import time 2lst = [(1, 3), (2, 5), (2, 4), (5, 4), (6, 9)] 3 4for i, k in enumerate(lst): 5 if i == 0: 6 pre = k 7 else: 8 print(pre) # debug用に追加 9 x = k[0] - pre[0] 10 y = k[1] - pre[1] 11 midx = pre[0] + x / 2 12 midy = pre[1] + y / 2 13 lst.insert(i+1, (midx, midy)) 14 pre = k 15 time.sleep(0.3) # debug用に追加(たくさん出てくると流れて鬱陶しいので) 16 17""" => 18(1, 3) 19(2, 5) 20(1.5, 4.0) 21(1.75, 4.5) 22(1.625, 4.25) 23(1.6875, 4.375) 24(1.65625, 4.3125) 25(1.671875, 4.34375) 26(1.6640625, 4.328125) 27(1.66796875, 4.3359375) 28(1.666015625, 4.33203125) 29(1.6669921875, 4.333984375) 30(1.66650390625, 4.3330078125) 31(1.666748046875, 4.33349609375) 32(1.6666259765625, 4.333251953125) 33(1.66668701171875, 4.3333740234375) 34(1.666656494140625, 4.33331298828125) 35(1.6666717529296875, 4.333343505859375) 36(1.6666641235351562, 4.3333282470703125) 37(1.6666679382324219, 4.333335876464844) 38(1.666666030883789, 4.333332061767578) 39... 40"""

対策

結果格納用のlistを別途作りましょう。

python

1lst = [(1, 3), (2, 5), (2, 4), (5, 4), (6, 9)] 2 3result = [] 4for i, k in enumerate(lst): 5 if i == 0: 6 pre = k 7 else: 8 x = k[0] - pre[0] 9 y = k[1] - pre[1] 10 midx = pre[0] + x / 2 11 midy = pre[1] + y / 2 12 result.append((midx, midy)) 13 pre = k 14 result.append(k) 15 16print(result) # => [(1, 3), (1.5, 4.0), (2, 5), (2.0, 4.5), (2, 4), (3.5, 4.0), (5, 4), (5.5, 6.5), (6, 9)]

投稿2018/11/15 02:46

hayataka2049

総合スコア30933

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

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

Ykkykk

2018/11/15 02:52

ご回答いただきありがとうございます。 元のリストに挿入しているためにリストが無限に増えていってしまうということなんですね。 結果を保存する別のリストが必要ということがわかりました。 ありがとうございました!
guest

0

ループ走査中のリストにinsertなどの操作をしているからです。
現在位置の後ろに挿入しているので、リストが無限成長していると思われます。
結果は別リストを用意し、そちらに格納するようにします。

Python

1lst = [(1, 3), (2, 5), (2, 4), (5, 4), (6, 9)] # 途中カンマが抜けていたので修正 2dst = [] 3for i, k in enumerate(lst): 4 if i == 0: 5 pre = k 6 else: 7 x = k[0] - pre[0] 8 y = k[1] - pre[1] 9 midx = pre[0] + x / 2 10 midy = pre[1] + y / 2 11 dst.append((midx, midy)) # 別のリストに追加 12 pre = k 13 14 dst.append(k) # 元要素も追加が必要 15 16print(dst) # [(1, 3), (1.5, 4.0), (2, 5), (2.0, 4.5), (2, 4), (3.5, 4.0), (5, 4), (5.5, 6.5), (6, 9)]

投稿2018/11/15 02:45

can110

総合スコア38234

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

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

Ykkykk

2018/11/15 02:50

ご回答いただきありがとうございます。元のリストに挿入してループを回しているため無限ループになってしまうということですね。 結果を挿入する別のリストを用意すべきだということがわかりました。 ありがとうございました!
guest

0

処理をリストの後ろから行えば、正常処理できます。
下のコードは、質問のコードを、処理順番を後ろから行うようにすこし変更をしただけです。
p.py

python3

1lst = [(1, 3), (2, 5), (2, 4) , (5, 4), (6, 9)] 2 3for i in range(len(lst), 0, -1): 4 print(i, lst) # debug 用 5 k = lst[i - 1] 6 if i == len(lst): 7 pre = k 8 else: 9 x = k[0] - pre[0] 10 y = k[1] - pre[1] 11 midx = pre[0] + x / 2 12 midy = pre[1] + y / 2 13 lst.insert(i, (midx, midy)) 14 pre = k 15 16print(lst) 17

実行例
イメージ説明

投稿2018/11/17 06:08

編集2018/11/17 07:40
katoy

総合スコア22324

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

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

Ykkykk

2018/11/18 23:22

ご回答いただきありがとうございます。 このように後ろから回す方法もあるのですね。 初歩的なことで恐縮なのですが、 for i in range(len(lst), 0, -1): の0と-1はどのような意味になるのでしょうか? 可能でしたらお教えください。
Ykkykk

2018/11/19 23:25

お教えいただきありがとうございます。 ドキュメントの方も確認いたします。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問