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

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

ただいまの
回答率

91.05%

  • Python

    5138questions

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

【質問】みんなのPython 第4版 chapter03 タプルの利点(p.134)

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 146

akaha

score 3

現在 みんなのpython【第4版】を読み、写経をしながら学習をしています。
以下についてご教授ください。

イメージ説明

「与えられた地点から最も近い県庁所在地を調べるプログラムを書いてみましょう。2点間の距離は、緯度と経度の差を2乗して足し、ルートを取ると簡易に求められます。今回は距離の比較をするだけなので、ルートを取らず、二乗した数値を比べることにします」とのことなのですが、

for key in pref_capitals:
dist = (loc[0]-key[0])2 + (loc[1]-key[1])2
if nearest_dist > dist:
nearest_dist = dist
nearest_cap = pref_capitals[key]

以上の部分(8-12行目)のコードがよく分かりません。

● dist = (loc[0]-key[0]) 2 + (loc[1]-key[1]) 2
この[]内に入っている数値は何を指しているのでしょうか?
loc[0]=41.768793  key[0]=43.06417  loc[1]=140.72881  key[1]=141.34694
を表しているのでしょうか?

●if nearest_dist > dist:
nearest_dist = dist
nearest_cap = pref_capitals[key]
ここのコード(10-12行目)はどういう意味なのでしょうか?

以上の2点になります。
何卒、宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+4

dist = (loc[0]-key[0])** 2 + (loc[1]-key[1])** 2


緯度と経度の差を2乗して足している処理です。
locは、loc[0]=41.768793, loc[1]=140.72881で合っています。この番号はインデックス番号です。タプルからも、普通のリストと同じようにインデックス番号を指定することで値を取り出せます。
keyは、辞書であるpref_capitalsのキーを取り出してループさせているものです。pref_capitalsではタプルがキーとして使われているので、1回目のループではkey[0]=43.06417, key[1]=141.34694となります。

if nearest_dist > dist:
    nearest_dist = dist
    nearest_cap = pref_capitals[key]


距離の比較をする処理です。
pref_capitalsをループさせることで、それぞれの座標への距離を出しています。その距離がnearest_distより近ければnearest_distの値を更新し、その座標をキーとする県庁所在地をnearest_capとしています。
これを繰り返せば、ループが終わったときには全体で最も近い県庁所在地とその距離が求められます。

ちなみに今回の場合、nearest_distの初期値が10,000になっているので、もし距離が10,000以下の県庁所在地がない場合は空文字が返されます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/08 23:53

    詳しくお答え頂き、ありがとうございます。2点とも理解することができました。

    キャンセル

+2

loc[0]=41.768793  key[0]=43.06417  loc[1]=140.72881  key[1]=141.34694

locに関してはドンピシャです。
keyに関しては、ループのうち一回は確かにそのようになりますね。

辞書のキーがタプルになっているのでちょっとややこしいだけです。

>>> my_dict = {(1, 2): 'a', (3, 4): 'b'}
>>> for key in my_dict:
...     print(key)
...     print(key[0])
...
(1, 2)
1
(3, 4)
3

タプル辞書について調べてみてください。


ここのコード(10-12行目)はどういう意味なのでしょうか?

最小値を求める典型的なアルゴリズムです。
暫定的に最小値nearest_distを決めておき、それより小さいときに更新します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/08 23:48

    お答え頂き、ありがとうございます。2点とも理解することができました。

    キャンセル

+1

質問の解決おめでとうございます。

nearest_cap = pref_capitals[key]


の部分ですが、for key, capital in pref_capitals.items():とすると、
nearest_cap = capitalで値を取得できます。dictからキーを元に再検索する必要がなくなります。
ご参考まで

# -*- coding: utf-8 -*-


def main():
    pref_capitals = {(43.06417, 141.34694): "北海道(札幌)",
                     (40.82444, 140.74): "青森県(青森市)",
                     (39.70361, 141.1525): "岩手県(盛岡市)"}

    loc = (39.70361, 141.1525)
    nearest_cap = ''  # 最寄りの県庁所在地名を保存する変数
    nearest_dist = 10000
    for key, capital in pref_capitals.items():
        dist = (loc[0] - key[0]) ** 2 + (loc[1] - key[1]) ** 2
        if nearest_dist > dist:
            nearest_dist = dist
            nearest_cap = capital
    print(nearest_cap)


if __name__ == '__main__':
    main()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/09 20:01

    ご教授いただきありがとうございます。
    回答からお聞きしたいのですが、

    if __name__ == '__main__':
    main()

    以上のコードはどういった意味をもつのでしょうか?

    キャンセル

  • 2018/01/09 20:09

    ■Python 「if __name__ == ‘__main__’:」の意味
    https://qiita.com/taigamikami/items/2713856b9f3c3b90f6fd
    29.4. __main__ — トップレベルのスクリプト環境
    https://docs.python.jp/3/library/__main__.html

    キャンセル

  • 2018/01/09 20:25

    ありがとうございます!

    キャンセル

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

  • ただいまの回答率 91.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    5138questions

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