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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

Python

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

Q&A

解決済

2回答

693閲覧

最寄駅のjsonデータから重複する駅(値)を除いて整理する

G350

総合スコア13

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/11/04 19:54

前提・実現したいこと

初めて質問させていただきます。
Python3で現在地から最寄駅の情報を表示するシステムを作っています。
緯度経度でリクエストすると、最寄駅情報が帰ってくるAPIを利用しています。

APIのサンプル
http://express.heartrails.com/api/json?method=getStations&x=139.7505027&y=35.7048605

レンスポンス [{'distance': '360m', 'line': '東京メトロ南北線', 'name': '後楽園', 'next': '東大前', 'postal': '1120002', 'prefecture': '東京都', 'prev': '飯田橋', 'x': 139.751864, 'y': 35.707898}, {'distance': '360m', 'line': '東京メトロ丸ノ内線', 'name': '後楽園', 'next': '本郷三丁目', 'postal': '1120003', 'prefecture': '東京都', 'prev': '茗荷谷', 'x': 139.751864, 'y': 35.707898}, {'distance': '450m', 'line': '都営三田線', 'name': '水道橋', 'next': '春日', 'postal': '1130033', 'prefecture': '東京都', 'prev': '神保町', 'x': 139.75516, 'y': 35.703398}, {'distance': '470m', 'line': 'JR中央線', 'name': '水道橋', 'next': '飯田橋', 'postal': '1010061', 'prefecture': '東京都', 'prev': '御茶ノ水', 'x': 139.754312, 'y': 35.702039}, ・・・ 以下略 上記のレスポンスデータから、↓ここまでは自分で取得できました。 '東京メトロ南北線 後楽園駅 360m', '東京メトロ丸ノ内線 後楽園駅 360m', '都営三田線 水道橋駅 450m', 'JR中央線 水道橋駅 470m', 'JR総武線 水道橋駅 470m', '東京メトロ東西線 飯田橋駅 540m', 【最終的にやりたいこと】 駅名と距離が同じ場合は以下のようにまとめたいです。 距離が近いものから順に表示したいです。 '東京メトロ南北線・丸ノ内線 後楽園駅 360m', #同じメトロなので、まとめる '都営三田線 水道橋駅 450m', 'JR中央線・総武線 水道橋駅 470m', #同じJRなので、まとめる '東京メトロ東西線 飯田橋駅 540m', ↓こちらでも構いません。 '東京メトロ南北線ほか 後楽園駅 360m', #同じメトロなので、最初の路線だけ表記して、「ほか」を追加 '都営三田線 水道橋駅 450m',  'JR中央線ほか 水道橋駅 470m', #同じJRなので、最初の路線だけ表記して、「ほか」を追加 '東京メトロ東西線 飯田橋駅 540m',

該当のソースコード

以下のようなif文をfor rangeで回したりしているのですが、思うような結果が得られずに困っています。
もっとスマートな方法があると思いますが、これしか思いつかずで、、、

Python3

1#駅同じ・距離同じ場合 2if 駅 == 駅+1 and 距離 == 距離+1: 3 処理1 4 5#駅同じ・距離が違う場合 6if 駅 == 駅+1 and 距離 != 距離+1: 7 処理2 8 9#駅違う・距離同じ場合 10if 駅 != 駅+1 and 距離 == 距離+1: 11 処理3 12 13#駅違う・距離違う場合 14else: 15 処理4 16

試したこと

zip()やenumerate()なども検討しましたが、どうにも正解にたどり着けませんでした。
どうかお力をお貸しいただけないでしょうか。

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

「同じメトロなので」とか「同じJRなので」という条件でまとめようとすると、おそらく正確に行うには運営主体対路線名をすべて網羅したデータベースが必要になるかと。ちょっと現実的ではありません。

位置、あるいは距離と駅名が一致していれば同じ場所とみなす、程度であれば簡単に行なえます。

下に示す程度の出力フォーマットで妥協できれば、幸せはすぐそこにあります。

  • 後楽園駅 360m

東京メトロ南北線
東京メトロ丸ノ内線

  • 水道橋駅 450m

都営三田線

  • 水道橋駅 470m

JR中央線
JR総武線

  • 飯田橋駅 540m

東京メトロ東西線

あとは文字列処理で先頭の一致部分は省略するとか、そういったセコい方法でやれなくはありませんが。どんな路線名でも正しく処理してくれるという保証はありません。


駅名と距離が同じ場合は以下のようにまとめたい

とりあえず駅名と距離をキーに、駅の情報のlistを値に入れた辞書を作ってみました。

python

1from collections import defaultdict 2 3import requests 4 5r = requests.get("http://express.heartrails.com/api/json?method=getStations&x=139.7505027&y=35.7048605") 6data = r.json()["response"]["station"] 7 8d = defaultdict(list) 9for sttn in data: 10 d[(sttn["name"], sttn["distance"])].append(sttn) 11 12for k,v in d.items(): 13 print(k, v) 14""" => 15('飯田橋', '540m') [{'prev': '神楽坂', 'next': '九段下', 'prefecture': '東京都', 'line': '東京メトロ東西線', 'x': 139.745986, 'postal': '1020072', 'y': 35.701725, 'distance': '540m', 'name': '飯田橋'}, {'prev': '牛込神楽坂', 'next': '春日', 'prefecture': '東京都', 'line': '都営大江戸線', 'x': 139.744999, 'postal': '1120004', 'y': 35.702927, 'distance': '540m', 'name': '飯田橋'}] 16('水道橋', '470m') [{'prev': '御茶ノ水', 'next': '飯田橋', 'prefecture': '東京都', 'line': 'JR中央線', 'x': 139.754312, 'postal': '1010061', 'y': 35.702039, 'distance': '470m', 'name': '水道橋'}, {'prev': '飯田橋', 'next': '御茶ノ水', 'prefecture': '東京都', 'line': 'JR総武線', 'x': 139.754312, 'postal': '1010061', 'y': 35.702039, 'distance': '470m', 'name': '水道橋'}] 17('水道橋', '450m') [{'prev': '神保町', 'next': '春日', 'prefecture': '東京都', 'line': '都営三田線', 'x': 139.75516, 'postal': '1130033', 'y': 35.703398, 'distance': '450m', 'name': '水道橋'}] 18('後楽園', '360m') [{'prev': '飯田橋', 'next': '東大前', 'prefecture': '東京都', 'line': '東京メトロ南北線', 'x': 139.751864, 'postal': '1120002', 'y': 35.707898, 'distance': '360m', 'name': '後楽園'}, {'prev': '茗荷谷', 'next': '本郷三丁目', 'prefecture': '東京都', 'line': '東京メトロ丸ノ内線', 'x': 139.751864, 'postal': '1120003', 'y': 35.707898, 'distance': '360m', 'name': '後楽園'}] 19"""

投稿2018/11/04 20:15

hayataka2049

総合スコア30933

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

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

G350

2018/11/05 11:59

コード付きのご回答ありがとうございます! ご提案いただいた結果で問題ございませんでした。 数日悩んでいたので、本当に助かりました。 defaultdictを使いこなせるように頑張ってみます。
guest

0

最初の集計単位をx,yでやればよいのでは?

投稿2018/11/05 01:56

yambejp

総合スコア114572

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

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

G350

2018/11/05 11:55

ありがとうございます、初心者なのでx,yをどのように利用するかが思いつきませんでした。 下記のコードで解決いたしましたので、Pythonを使い方を深めていこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問