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

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

新規登録して質問してみよう
ただいま回答率
85.35%
GPS

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

2回答

1268閲覧

隣り合った要素の取得方法

noggi

総合スコア8

GPS

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2021/07/20 19:31

前提・実現したいこと

初心者質問で申し訳ありませんがよろしくお願いします。

Pythonを使って○秒ごとの移動距離を測定できるようにしたいです。
GPSで○秒毎に座標を取得することはできました。
移動が終わったら取得を中止して、
緯度・経度ごとにリストに格納して、forで取り出して、geodesicで距離を出そうと考えました。

geodesicでは2地点必要になるので、
例えばfor i in ido:とした場合、iを1点と、その次の(より新しい)iを2点目としたいのですが、2点目の書き方が分かりません。
どのようにしたら、「緯度iと、一つ新しい緯度i」と書けるでしょうか

また、より良い書き方がありましたら教えていただけると幸いです。

発生している問題・エラーメッセージ

エラーにはならないが欲しい値が取得できない

該当のソースコード

Python

1for i in ido: 2 for k in keido: 3 a = (i, k) 4 b = (i+1, k+1) 5 6 dis = geodesic(a, b).km

試したこと

Iter でnext関数等も調べてみました。スライス等も見てみました。

補足情報(FW/ツールのバージョンなど)

Pythonista3 python3
ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

Python3.10 から標準ライブラリに採用された関数ですが、
itertools.pairwise が目的の動作をします。

3.9 以前は標準ライブラリには含まれず、サンプルコードがドキュメントのレシピに記載されてました。
3.9 以前の環境では、レシピに載っている関数は、標準ライブラリには含まれませんが、
pip install more-itertools で別途インストールできます。

python

1 2# 3.10 3from itertools import pairwise 4 5# 3.9 以前 more-itertools 6from more_itertools import pairwise 7 8# 代替実装 (簡易版) 9# 一つ前の値をprevに記録しておき、 10# 新しい値currentと同時に返すジェネレーターとして実装。 11def pairwise(sequence): 12 iterable = iter(sequence) 13 prev = next(iterable) 14 for current in iterable: 15 yield prev, current 16 prev = current 17 18# pairwise() の挙動確認 19 20for n, m in pairwise([1, 2, 3, 4]): 21 print(n, m) 22 23# 1 2 24# 2 3 25# 3 4

緯度・経度が別々のリストなのであれば、
組込関数のzip関数で組み合わせられます。

python

1# zip関数の挙動確認 2 3for a, b in zip([1, 2, 3], [4, 5, 6]): 4 print(a, b) 5 6# 1 4 7# 2 5 8# 3 6

効率を考えないのであれば、zip() を使い、
こんな実装方法も可能です。

python

1 2def pairwise(seq): 3 return zip(seq[:-1], seq[1:]) 4 5# seq = [1, 2, 3, 4] とした場合、 6# seq[1:] は [2, 3, 4] 7# seq[:-1] は [1, 2, 3] なので 8# zip([1, 2, 3], [2, 3, 4]) => [(1,2), (2,3), (3, 4)] 9 10# 要素数が一致しない場合は、残りの要素を無視するので、 11# 最初のスライスは省略可 zip(seq, seq[1:])

追記: GeoPy にも ユーティリティとして pairwise 関数がありました。

python

1# https://github.com/geopy/geopy/blob/ade9c1b68c83a1fc76d90bc0ff603f6b34dfbbbf/geopy/util.py 2# from geopy.util import pairwise でインポートできるはず 3 4def pairwise(seq): 5 """ 6 Pair an iterable, e.g., (1, 2, 3, 4) -> ((1, 2), (2, 3), (3, 4)) 7 """ 8 for i in range(0, len(seq) - 1): 9 yield (seq[i], seq[i + 1])

最初に紹介した方法との違いは、リスト等のシーケンスのみを対象とします。
itertoolsの実装では、より汎用的で、イテレーターを対象にすることが出来ます。


python

1 2lat_list = [35.1, 35.2, 35.3] 3lng_list = [140.0, 139.9, 139.8] 4 5for prev, current in pairwise(zip(lat_list, lng_list)): 6 print(prev, current) 7 8# (35.1, 140.0) (35.2, 139.9) 9# (35.2, 139.9) (35.3, 139.8)

投稿2021/07/21 01:05

編集2021/07/21 01:11
teamikl

総合スコア8760

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

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

noggi

2021/07/21 16:27

ご丁寧に解説いただきありがとうございました!zipの使い方、面白いですね!ひとまずGeopyでpairwiseもやって見ようと思います。本当に助かりました、ありがとうございました!
guest

0

ベストアンサー

方法はいろいろとありますが、初心者の方にわかりやすいのは以下です。

python

1>>> print(ido) 2[3.872, 4.174, 5.59, 6.882, 7.102] 3>>> print(keido) 4[4.881, 4.969, 4.707, 3.674, 3.264] 5>>> for i in range(len(ido)-1): 6... a = (ido[i], keido[i]) 7... b = (ido[i+1], keido[i+1]) 8... print('a =', a) 9... print('b =', b) 10... print('------------------') 11... 12a = (3.872, 4.881) 13b = (4.174, 4.969) 14------------------ 15a = (4.174, 4.969) 16b = (5.59, 4.707) 17------------------ 18a = (5.59, 4.707) 19b = (6.882, 3.674) 20------------------ 21a = (6.882, 3.674) 22b = (7.102, 3.264) 23------------------

こういうのでもできます。

python

1>>> print(ido) 2[3.872, 4.174, 5.59, 6.882, 7.102] 3>>> print(keido) 4[4.881, 4.969, 4.707, 3.674, 3.264] 5>>> 6>>> b = (ido.pop(0), keido.pop(0)) 7>>> while ido: 8... a = b 9... b = (ido.pop(0), keido.pop(0)) 10... print('a =', a) 11... print('b =', b) 12... print('------------------') 13... 14a = (3.872, 4.881) 15b = (4.174, 4.969) 16------------------ 17a = (4.174, 4.969) 18b = (5.59, 4.707) 19------------------ 20a = (5.59, 4.707) 21b = (6.882, 3.674) 22------------------ 23a = (6.882, 3.674) 24b = (7.102, 3.264) 25------------------

投稿2021/07/20 21:27

編集2021/07/20 22:14
ppaul

総合スコア24670

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

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

noggi

2021/07/21 16:24

1つ目はリストの長さ−1の数をインデックス?に当てることで、順番に取り出せる。2つ目はpop()で最初の要素を取り出して削除していくことで順番に取り出せる。何となく理解できたと思います!すごいです!迅速にご対応いただけたのでベストアンサーとさせていただきます、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問