元バンドマンITエンジニアの語り場

ITのこととか、趣味のこととか、日々の至福と鬱憤とか

【Python学習】ディクショナリとキーの存在確認

お世話になっております。

 

僕は普段インフラネットワークの提案・設計・構築プロジェクトに携わっているので、"プログラミング言語というものを利用してアプリケーションや新しい仕組みを創造する"という仕事にはからっきし関わったことがありません。

 

バンド出身だし、学生時代は文系だし、、そもそもITリテラシーが非常に低い...(笑)

ということでプログラミング言語という言葉を聞いただけでも頭が痛くなるタイプの人間です。

 

とはいえITエンジニアとして、将来に向けてどういったキャリアパスを描こうか〜なんてことを考えなければならない時が来るもので、、

 

自身のキャリアパス皮算用してみると、やっぱりプログラミングアレルギーは克服しないとなあ。。と思うわけです。(残念)

 

 

 

世の中に存在するプログラミング言語と呼ばれるもの..

 

C、C++C#JavaJavaScriptRubyPHP、Swift...etc

techacademy.jp

 

まあ色々あります。

それぞれ得意なことがあるようですが、びっくりするくらい予備知識がないもので、徹底比較されてもピンとこないし正直どれを学習しても同じ...(笑)

なんですがどうせ勉強するなら流行りというか時流に乗っている言語がいいなあと思い、近年AIのような人工知能や、データ統計・解析の分野で注目を集めている...

 

 

f:id:Mickey6:20181002003912j:plain

 https://matome.naver.jp/odai/2143676409687507501

 

マムシ

ではなく、Pythonを覚えてみようかなあと細々学習することにしました。

 

流行りだけあって書店の言語コーナーにPython関連書籍の多いこと多いこと。

今やプログラミング言語の書籍の中で一番取り扱いが多いんじゃないでしょうか。

 

まあ内容はぶっちゃけどれも似たり寄ったり(玄人向け技術書を除く)と感じたので、装丁が自分好みのものを選び、自宅PCにPythonの開発環境を構築し(開発環境の準備についてはインターネットにたくさん情報があるので割愛しますね)、参考書に沿って学習しているわけです。

 

paiza.hatenablog.com

 

 で、

今回のメインはここからで、学習していく中で初心者なりにこの考え方は覚えておきたいと直感で感じたことがあったので備忘録として書き残しておきます。

 

あまりに低レベルなことを書き始めるので、このページを訪れた熟練者の方々は泡吹いて失神してください。

 

何を覚えておきたいと思ったかというと、タイトルに書いてあるんですが、

 

"ディクショナリとキーの存在確認"

 

という考え方です。

 

 表題について語る前に、pythonで複数データを並べてまとめて管理することができる

 「リスト」というものに軽く触れておきます。

 

リストはデータをまとめて放り込んでおける箱のようなもので、数値や文字列だけに関わらずpythonで扱うデータはなんでも格納することができます。

リストに格納する各データをそれぞれ「要素」と呼ぶことにします。

 

リストの作成方法

 

リストを定義するためには角カッコ"[ ]"にリストに入れたいデータを並べて書きます。

 

f:id:Mickey6:20181003225437p:plain

         ※趣味全開ですみません笑

上記の例では変数に文字列のリストを格納しています。

print関数で作成したリストを呼び出すと、格納した文字列が順番に出力されているのがわかります。

 

リストには複数の要素が入っているので、各要素にインデックスという番号を割り当てて、それぞれの要素を識別します。

インデックスは0から始まり、インデックスを指定することでリストから特定の要素を取り出すことができます。

 

f:id:Mickey6:20181003230202p:plain

実際に書いてみるとわかりやすいですね。

 

変数の後に["インデックス番号"]を指定することで、指定したインデックスに対応する要素を出力することができます。

 

リストには他にも異なる二つのリストを連結してひとつのリストにすることや、リスト内の要素から特定のデータのみを取り出したり、新たに要素を加えたり、削除したりすることもできます。(ここでは説明を割愛します)

 

このリストとインデックスというものに似た考え方が今回の趣旨となる"ディクショナリとキー”です。

 

 

ディクショナリは自由に作成できる辞書

前述したリストは非常な便利な機能で、好きなデータを放り込んで管理することができます。

便利ではあるのですが、リスト内の特定要素を呼び出すにはそれに対応するインデックス番号を指定する必要がありました。(=インデックス番号を覚えておかなければならない)

 

これなかなか面倒ですよね。

インデックスは意味を持たない番号なので、この番号と要素の対応を記憶するのは至難の技だと思います。

 

ここで登場するのが"ディクショナリ"という考え方です。

ディクショナリはリスト同様様々なデータを格納する、、今度は「辞書」と考えてください。

 

そしてリストではインデックス番号が要素と紐付いていました。

ディクショナリでは、インデックスの代わりに"キー"という見出し(ラベル)で各要素を識別します。

 

某バンドのドラマーを調べたいときに、インデック番号を思い出すのではなく、キーを「ドラム」とあらかじめラベリングしておけばより簡単に特定の要素を呼び出すことができるのは想像できるかと思います。

 

自分辞書の作り方

 ディクショナリを定義するためにはカッコ"{ }"にキーとそれに対応する要素を格納します。

 

{ キー1 : 要素1 , キー2 : 要素2 , キー3 : 要素3 ... }

 

これも実際に作成した方がわかりやすいと思います。

 

f:id:Mickey6:20181003234430p:plain

 小さくてわかりにくいですが、上記のようにキーと要素を対応させます。

 

作成したディクショナリから例えばドラマーを表示させたいときは、

 

f:id:Mickey6:20181003234737p:plain

 

上記のように変数の引数にキーを指定します。

 

ディクショナリも新たにキーを追加したり、削除したりすることができます。

 

in演算子によるキーの検索

ディクショナリとは何ぞやがなんとなくわかったところで、もう少し踏み込んだお話を。

 

pythonには"in演算子"というものがあり、in演算子を使用すると、文字列やリストのような複数要素をもつデータの中に、特定の要素が含まれているか、存在しているかを検索することできます。(もう寝ないといけないので in演算子に付いてはリンク先でも見ておいてください)

 

qiita.com

 

このin演算子とディクショナリを組み合わせると、"キーの検索"をすることができます。

データベースを管理する場合でも、データの正規化をする場合でも、本の目次でも、

調べたい対象がある時にその対象を直接探すのではなく、まずキーや見出しのようなものを最初に調べて、そこから目的のデータ(情報)にたどり着きます。

pythonプログラムでも同様に、ディクショナリを使用する時は、要素よりキーを検索することの方が多い(らしいです)。

 

ディクショナリでキーの検索をする時にin演算子を使用するというわけです。

 

ここでin演算子を使用したキーの検索の一例をプログラムに書いてみます。

 

例えば、"10進数を2進数に変換する"というプログラムを作ってみましょう。

引数で受けた10進数の整数(1から10まで)を2進数に変換する、という構文にします。

 

最初にディクショナリを使わないで上記要件を満たすプログラムを書いてみます。

 

f:id:Mickey6:20181006000347p:plain

 

えっと、ものすごく効率の悪い素人プログラムですみません。

(凄腕プログラマーさん、頭抱えないでください...笑)

 

「もし引数が10進数XXだったら、2進数XXを出力する」というif文を1から10の整数分記述しています。

 

定義した関数に引数3を渡して実行すると2進数に変換されて出力されていますね。

最初に決めた要件は満たせていそうですが、if文をここまで繰り返すのは美しくないですよね。

 

では次にディクショナリを用いて同じ要件を満たすプログラムを作ってみます。

ここで、10進数と2進数を、キーとその要素という関係にしてディクショナリに放り込みます。

 

f:id:Mickey6:20181006002830p:plain

どうでしょうか。

同じ要件を満たすプログラムでも随分スッキリしました。

 

最初に10進数をキーとした2進数のディクショナリを定義しておいて、

in演算子を使用して、引数で指定した値と同一のキーをディクショナリから検索して、キーが存在すれば対応する2進数を出力、そもそもキーが存在しなければエラーメッセージを出力する。

 

このように、要件によっては、がむしゃらにプログラムを羅列するのではなく、ディクショナリを作成して、キーを検索しながら対象の情報を取り出すような書き方をした方が効率がいい場合もあるということです。

pythonコンパイルしない言語なので、スッキリ書いておいた方が処理速度も早いはずですし。

 

以上、python超初心者の備忘録でした。