Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

Pythonの辞書、キーと値の関係 - Python独学記

f:id:konie_ko:20200728170732p:plain

連載:「Python独学記」とは?

f:id:kenken0326:20190710153503p:plain
konie

こんにちは、PyQ運営チームのkonieです。担当はマーケティングですが、Pythonの楽しさに目覚めて独学しています。

独学しているとどうしても行き詰まってしまうこと、ありますよね。 私はどうも釈然としなくてずっと同じ問題を解いていたり、解説を何度も読んでいたりすることがよくあります。

自分の中で引っかかっている部分を調べているとき、独学している人の経験談はとても参考になります。その知見の中から解決のヒントを得られたこともたくさんあります。

私も自分の独学する中で理解したことをPython学習チャンネルを通じて紹介することで、Pythonを勉強する誰かの役に立てればと思い、定期的に自分の「Python独学記」を投稿することにしました。

この独学記を読んで欲しい人・Pythonレベル

プログラミングを独学で学習しはじめた人です。

私自身は他言語からの独学ですが、はじめて学習する人にもわかりやすく、一緒に学べるように執筆したいです。

今回はPythonの辞書を学習している時に私が勘違いしてしまったまま学習を進めてしまった箇所や、どう学習していったのかを紹介します。

まずPythonの辞書の基本的な文法についてまとめました。記事後半では、私が辞書の値とキーについてつまずいた箇所とその解決内容を紹介しています。

辞書とは

辞書とは「キー」と対応する「」をもつデータです。

辞書には以下の特徴があります。

  • 辞書ではキーごとに対応する値を持つ
  • 複数の「キーと値のペア」の間には、順序はない
  • キーと値を追加、削除できる
  • キーを利用して値を変更できる

f:id:konie_ko:20200728172018p:plain

辞書の基本の使い方

Pythonの辞書の作成方法

Pythonの辞書の作成方法です。 空の辞書はキーと値を追加するまで何のキーと値も持っていない状態です。

作成したプログラム

# 空の辞書の作成
health_result_kara = {}

# キーと値がすでに入っている辞書の作成
health_result = {'名前': '佐藤', '身長': 170, '体重': 60}

print(health_result_kara)
print(health_result)

実行結果

{}
{'名前': '佐藤', '身長': 170, '体重': 60}

空の辞書と、キーと値が入っている辞書をprint()で表示しました。

辞書の値の追加や削除、変更

作成した辞書へキーや値を追加したり削除・変更できます。

コード 実行後の辞書の中身
health_result['視力'] = 2.0 {'名前': '佐藤', '身長': 170, '体重': 60, '視力': 2.0} 辞書にキーと値を追加
health_result['名前'] = 田中 {'名前': '田中', '身長': 170, '体重': 60, '視力': 2.0} 指定したキーに対応する値が上書きで変更される
del health_result['体重'] {'名前': '田中', '身長': 170, '視力': 2.0} 指定したキーと対応する値が削除される
health_result.pop('視力') {'名前': '田中', '身長': 170} 指定したキーと対応する値が削除される。また実行後は指定したキーに対応した値を返す

Pythonの辞書でできること

辞書に値を追加・削除する以外にもできることがあります。

※使用した辞書は以下

health_result = {'名前': '佐藤', '身長': 170, '体重': 60}
コード 返ってくる値(print()で表示される値)
health_result['体重'] 60 キーに対応する値を取り出す
health_result.get('体重', 'キーがない場合に返す値')
health_result.get('視力', 'キーがない場合に返す値')
60
'キーがない場合に返す値'
辞書内に指定のキーがある場合は対応する値を、なければ第二引数('キーがない場合に返す値'と書いた部分)が返される
health_result.keys() dict_keys(['名前', '身長', '体重']) 辞書のキー一覧
health_result.values() dict_values(['佐藤', 170, 60]) 辞書の値一覧
health_result.items() dict_items([('名前', '佐藤'), ('身長', 170), ('体重', 60)]) 辞書のキーと値をついにした一覧

Pythonの辞書でのつまずき

私はPyQでPythonを学習しているのですが、辞書の単元を学習していると次々に辞書を操作するためのプログラムが紹介され、覚えるのが大変でした。 最初は辞書の作り方、次は辞書にキーと値を追加したり、削除したりと今まで学習してきた単元よりもいろんなプログラムがありました。 どんどん新しいプログラムが出てくるので1つのプログラムがふに落ちるより前に進んでしまい、ものすごく難しく感じました。

本当は、自分なりに理解できてから次の単元に進めたかったのですが、時間がかかりそうなので一旦次の単元を進めることにしました。 しかし次の単元でも辞書が出てきたのです。別単元なので辞書の解説はされていないため、わからないままです。 ですが、ある程度進んだ時に辞書に関するふわふわしていた部分(後に記載)についてわかったような気がしたのです。

なので、もう一度辞書の単元を振り返ってみました。あらためて問題や解説を読んでみると「そういうことか!」と最初に学習した時よりも辞書について理解できました。

今回は初めて辞書を学習している時に理解できていなかった根本的な部分の2つのお話をします。

辞書のキーと値の区別がつかず、キーを使って値を取り出せない

1つ目は、キーを使って値を取りだすことができなかったことです。そもそもキーと値の区別がついていなかったのです。そのためキーの役割がわかりませんでした。 辞書を作成したあとに「辞書から値を取り出しましょう」という問題があっても、キーと値の区別がついていなかったので、「何を使えば何を取り出せるのか」がわかりませんでした。

キーから値を取り出せない具体例

以下のような辞書から値を取り出そうと思います。

health_result = {'名前': '佐藤', '身長': 170, '体重': 60}

# 自分
health_result[???]

# 正解
health_result['名前']

キーの役割がわからず「値を取りだすコードはhealth_result[キー]です」と解説があっても、一体左右のどちらがキーにあたるのか、どうして値を取りだすのにキーが必要なのかがわからなかったのです。

最初は解説や練習問題などに書かれている通りプログラムを書いていました。 そして演習問題に臨んだ時、何もみない状態でコードが書けませんでした。「キーってどっち?左側に書いたほうがキーだったかな」など考えましたがキーと値の違いをよくわからないまま、解説や練習問題のページに戻ってそれらしく書き進めてしまいました。

その結果辞書の単元が終わっても根本的な部分が理解できていないままで、いまいち身についた感じがしませんでした。

コードをじっくり読むことで辞書のキーと値の違いを理解

辞書について理解していないと思いつつも、「今は理解できなさそうな気がする。時間をおいて復習してみよう」と思い次の単元に進んでみました。 しかしその単元でも辞書が出てきたのです。 まずは模範回答に書いてあるまま写経をしてみましたが、やはりピンときませんでした。

「わからないまま進めてしまったが、早く理解しないとこの先もどんどん辞書が出てきて苦戦しそうだな」と感じ、ここで頑張って理解しておこうと思いました。 そこで、模範回答のコードがどういう動きをするのかを1つ1つ考えていくことにしました。 1つ1つの動きを考えていくうちに「あれ、キーは自分が指定しているものだから'名前'や'身長'のほうのことか」と思い至ったのです。 ここで、わかっていなかった前の単元、辞書をもう一度振り返ることにしました。

キーと値の役割と値の取り出し方のまとめ

health_result = {'名前': '佐藤', '身長': 170, '体重': 60}

上記の辞書から値を取りだす場合、’名前’を指定して「佐藤」を取りだし、’佐藤’を使って「名前」を取りだすことはないのだということを理解しました。 こうして、私は自分で辞書を作り、キーと値を追加できるようになりました

ここまでで理解できた、辞書のキーと値についてまとめると以下になります。

  • キーは辞書を表示した時左側に書かれている
  • 値は辞書を表示した時右側に書かれている
  • キーは値を取り出したい時に必要なもの
  • 値は後で取り出して使いたいもの
  • キーから値を取り出し、値からキーを取りだすことはない

1つのキーに対応する値は何個持てるのかわからない

理解できていなかったことの2つ目は、キーに対して値が1つであることをわかっていなかったことです。 キーに対していくつか値を持っており自在に取り出せるものだと思っていました。 辞書の単元の前に学習したリストの単元で、値にインデックスが割り振られていて指定することでその値を取りだすことができました。 同じように辞書でも複数ある値に対してインデックスが割り振られており、指定することで1つの値が取り出せると思っていました。 この思い込みも長く辞書についてふに落ちていなかった1つの原因だと思います。

イメージ

辞書{
    キー:値、値、値
    キー:値、値、値
    ・・・・・・
}

辞書の値はキーに対して1つのみ

こちらもキーと値の違いでお話したように、次の単元に進んでから間違いであることに気がつきました。 実際にfor文などを使って次々と値を取り出して行った時に、「値ってもしかして1つのキーに対して1つしかないのか?」と考えて、振り返ってみました。

# 思っていた辞書の形
health_result = {'名前': '佐藤','田中','渡辺', '身長': 170, 150, 167, '体重': 60, 50, 58}

# 実際の辞書の形
health_result_sato = {'名前': '佐藤', '身長': 170, '体重': 60}
health_result_tanaka = {'名前': '田中', '身長': 150, '体重': 50}
health_result_watanabe = {'名前': '渡辺', '身長': 167, '体重': 58}

辞書の単元を振り返ってみると、どの辞書でもキーに対して値は1つでした。

まとめ

今回は私の辞書でのつまずいた部分をお話ししました。 辞書のキーと値は一対になっており、キーから値を取りだすことができるという大事な部分をお伝えしました。

学習方法の面では、行き詰まった時にいつもと違う進め方をしてみることで解決しました。このことも参考になるとうれしいです。 私は普段ひとつひとつの単元をわかるまで徹底的に学習するタイプなのですが、今回はとりあえずわからないまま先に進むことで疑問を解決できました。 普段からこのような進め方をしている人は、反対にひとつの単元をしっかり理解できてから進んでみるなど、学習方法を少し変えてみると理解できることがあるかもしれません。

これからも一緒にPythonの学習をがんばっていきましょう。

Copyright ©2017- BeProud Inc. All rights reserved.