python3
python3.6

Python 辞書を見つめ直す

基礎的なものを見つめ直す

 日常的に、使っているものを磨き直すのもありなんじゃないかなと思い立って、今回は辞書を様々な観点から見つめ直してみます。

まず、シーケンス型とは?

Pythonでシーケンスと呼ばれるものは、ビルトイン型の中に位置し、要素間に順序があることが大前提です。

辞書型とは何か?

ある範囲の数でindex化されているシーケンスと異なり、キーでindex化されます。
これは、シーケンス型と区別され、マップ型と呼ばれます。
キーは一意です。(それを、キーと呼ぶのだから)つまり、イミュータブルである必要があります。
キーと、それに対応するものを、valueと呼びます。よって、

{key: value}

という形です。

キーに対しての操作

  1. キーの存在確認

当然 inキーワードを使います。

dic = {"apple":"red", "grape":"purple"}

"apple" in dic  # True
  1. キーとvalueの組み合わせの、タプルを辞書化

dict()コンストラクタを使います。

dic = dict([("apple","red"), ("grape", "purple")])

キーが簡単な場合、そういえばこんな技も使えましたね

dict(apple=2, grape=3)

辞書の要素数(キーの数)を知る。

言わずもがな、len()関数ですね。

d = {"apple":"red", "grape":"purple"}
len(d)

ループのテクニック

ループでキーと値を同時に取り出すには、items()メソッドを用います。
それぞれを取り出すには、keys()メソッドと、values()メソッドを用いれば良さそうですね。

knights = {'gallahad': 'the pure', 'robin': 'the brave'}
for k, v in knights.items():
    print(k, v)

enumerate()関数を用いると、カウンターを用いることができます。

knights = {'gallahad': 'the pure', 'robin': 'the brave'}
for i, k in enumerate(knights):
     print(i, k)

辞書の連結

update()メソッドを用いることで、2つの辞書を連結することができます。
2つの辞書のキーに重複があるとき、メソッドの引数の辞書の要素が優先されます。

d1 = {"apple":"red", "grape":"purple"}
d2 = {"orange":"orange"}

d1.update(d2)  # {"apple":"red", "grape":"purple", "orange":"orange"}

要素の削除

削除には、いつも肝がついて回ります。

del文

delは、引数に渡したオブジェクトを削除する文です。つまり、消したいものが、そのまま引数に渡されている必要があります。つまり、辞書では以下のようになります。

del d["apple"]

pop()メソッド

挙動は単純で、キーを指定すると、その中のものを辞書から「取り出して返します」。奪うって感じですかね。
僕が気にかけたのは引数です。

d.pop("hoge", 2) # 第2引数は、キーが存在しない場合にリターンされる。

これは便利ですね。

popitem()メソッド

キーを指定せず、1こづつランダムに取り出して行くときに使います。

d1 = {"apple":"red", "grape":"purple"}
while d1:
    d1.popitem()

clear()メソッド

辞書の要素を全て削除します。このとき、辞書は空辞書として残ります。

終わりに

基本的なものの見つめ返しでしたが、Pythonicな発想をする上で、必須なものばかりではないでしょうか。
以降もPythonの基礎を見つめ直していこうと思います。

参考

5. データ構造 — Python 3.6.3 ドキュメント
辞書(ディクショナリ) - Python入門