Python3の美麗なる辞書

まえがき

辞書はPython3で唯一のマッピング型。変更可能体:ミュータブル。ハッシュ可能な値のみをキーにすることができる。つまり、ミュータブルなリストや辞書などはキーにできない。

謝辞

「Pythonチュートリアル」の著者、Pythonの産みの親、Guido van Rossum氏。

翻訳者であり日本野人の会CEOである、鴨澤眞夫氏。

「退屈なことはPythonにやらせよう」の著者、Al Sweigart氏、訳者の相川愛三氏。

出版に携わった全ての人に感謝したい。

変更履歴

新規作成:2020/03/15

この記事の環境

Python3: 3.8.1

モジュール: 標準モジュール(pprint)

OS: MacOS X

IDE: Spacemacs

env: virtualenv & pyenv

辞書の作り方 & 呼び出し方

辞書はブレイシズで囲う。またはdict()メソッドで辞書を作れる。

作り方 & 呼び出し方:コード

# 作り方、宣言
dict_empty = {}
dict_data = {"A" : 1, "B" : 2, "C" : 3}
dict(D=4, E=5)
dict([("F", 6), ("G", 7)])

# 呼び出し方
dict_data["A"]
dict_data["B"]
dict_data["C"]
dict_data["D"]
dict_data["E"]
dict_data["F"]
dict_data["G"]

# 値の変更
dict_data["A"] = 12

作り方 & 呼び出し方:実行結果

dict([("F", 6), ("G", 7)])の分がなかった。ソーリー。

辞書のメソッド

辞書のような構造をリストでも構築できるが、取り出すときに頭から探し始める文リストでは時間がかかる。辞書ならピンポイントでキーを指定して操作できる。存在する場合にのみ更新する「setdeafault()」メソッドが便利。

削除は「del」でもできるがどんな時に使うのか謎。

メソッド:コード

# 辞書のメソッド
dict_data2 = {"A" : 1, "B" : ,"C" : 3}
dict_data2.keys()
dict_data2.values()
dict_data2.items()
dict_data2.get("A")
# ないとnone、キーを指定したやり方dict_data2["Z"]だとエラーになるが
# get()メソッドだとエラーにならない
dict_data2.get("Z")

# 値の変更、もしもなければ追加する
dict_data2.setdefalt("D", 22)
# 値の変更, 更新
dict_data3 = {"A" : 33, "X" : 9}
dict_data2.update(dict_data3)

# キー:値の削除
dict_data2.pop("B")
del dict_data2["C"]

# コピー、参照渡しということを忘れるな。大元ごと変更されるお。
same_dict = {"M" : 56}
some_val = some_dict
some_val["M"] = 44
print(some_dict)  # {"M" : 44}
print(some_val)  # {"M" : 44}

# copy()メソッドの場合, 値渡しのようになる
same_dict2 = {"L" : 512}
some_val2 = some_dict.copy()
some_val2["L"] = 1024
print(some_dict)  # {"L" : 512}
print(some_val)  # {"L" : 1024}

メソッド:実行結果

辞書の内包表記

辞書にも内包表記がる。使うがヨロシ。下記では3時のおやつを食べ物と飲み物をセットで登録したい場合を想定。fruitsがキーになるのはあまり適当ではないが、まぁいいじゃないか。

内包表記:コード

fruits = ["Apple", "Banana", "Mango"]
juice = ["Cola", "RedBUll", "Mitsuya-Sider"]

okasi_dict = {}
for f, j in zip(fruits, juice):
    okasi_dict[f] = j

okasi_dict = {f : j for f, j in zip(fruits, juice)}

辞書を綺麗に整形出力する

通常のprint()ではできない、辞書の内容をきれいひ整形して出力してくれるメソッドがある。それが、pprint()またはpformat()である。importする必要あり。両方ともpprintクラスにあるがpprint()は出力し、pformat()は文字列を返す。

整形出力:コード

from pprint import pprint, pformat

bunnsyo = "I thought what I'd do was, I'd pretend I was one of those deaf-mutes or should I?"

moji_dict = {}
for character in bunnsyo:
    moji_dict.setdefault(character, 0)
    moji_dict[character] += 1

pprint(moji_dict)
print(pformat(moji_dict))

# 内包表記でやるとこうなるお
moji_dict2 = {}
moji_dict2 = {moji_dict2.setdefault(character, 0) for character in bunnsyo}

pprint(moji_dict2)

整形出力:実行結果

内包表記が微妙だけど一応ちゃんと出力されてる。内包表記でも今回のような場合は一旦、空の辞書を作っておく必要があるってことかな?

むすび

リストと違って順番では無く、キーによってデータを扱うということはリストより辞書の方が、実際に人間が扱っているもののように使いやすいのだと思う。つまりモデル化できるということ。

最初はどういうモデルにするか考えている時間の方が長いかもしれない。

コメントする