辞書はリストと似ています.リストは0,1,2,...というオフセットで要素を順番に管理していた.辞書では(Python 3.6までは)要素に順序はなく,一意のキーで管理します.ただし,Python 3.7 からはキーの順序も保証されるようになった.
辞書を生成するには,'キー' : 値,
を複数並べて { }
で囲う.次の例では有名な小説(源氏物語(紫式部),坊っちゃん(夏目漱石),走れメロス(太宰治),羅生門(芥川龍之介))の冒頭の文を,小説のタイトルをキーに管理します.
novels = {
"genji" : "どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。",
"bocchan" : "親譲の無鉄砲で小供の時から損ばかりしている。",
"meros" : "メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。",
"rashomon" : "ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。",
}
全体を表示します.Python 3.6 以前での結果は要素の順序は保証されませんでした.
print(novels)
{'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。', 'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。', 'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。', 'meros': 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。'}
しかしながら,Python 3.7 以降では定義した順序で表示されるようになりました.
print(novels)
{'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。', 'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。', 'meros': 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。', 'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。'}
特定の要素を取り出すにはキーを指定すれば良いでしょう.坊っちゃんの冒頭だけ取り出してみよう.
print(novels['bocchan'])
親譲の無鉄砲で小供の時から損ばかりしている。
要素を追加するには新たなキーを指定するだけで良いでしょう.「学問ノススメ(福沢諭吉)」も追加しよう.追加した結果について,以前は要素の順番が保証されていなかったが,Python 3.7 以降では最後に追加されているはずです.次の例は Python 3.9 系での結果です.
novels['gakumon'] = '「天は人の上に人を造らず人の下に人を造らず」と言えり。'
print(novels)
{'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。', 'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。', 'meros': 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。', 'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。', 'gakumon': '「天は人の上に人を造らず人の下に人を造らず」と言えり。'}
既存のキーを指定すれば,要素が書き換えられる.「走れメロス」の文を短く変更してみます.
novels['meros'] = 'メロスは激怒した。'
print(novels)
{'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。', 'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。', 'meros': 'メロスは激怒した。', 'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。', 'gakumon': '「天は人の上に人を造らず人の下に人を造らず」と言えり。'}
キーを指定して要素を削除できます.
del novels['meros']
print(novels)
{'genji': 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。', 'bocchan': '親譲の無鉄砲で小供の時から損ばかりしている。', 'rashomon': 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。', 'gakumon': '「天は人の上に人を造らず人の下に人を造らず」と言えり。'}
in
を使います.指定したキーが辞書にあれば True
,なければ False
を返す.「源氏物語」のキー「genji」が辞書にあるかチェックします.
novels = {
"genji" : "どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。",
"bocchan" : "親譲の無鉄砲で小供の時から損ばかりしている。",
"meros" : "メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。",
"rashomon" : "ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。",
}
'genji' in novels
True
「銀河鉄道の夜」 (ginga) は登録されていない.
'ginga' in novels
False
keys()
ですべてのキーを取得できます.これは辞書に対して繰り返し処理を行う際などに利用されます.
novels.keys()
dict_keys(['genji', 'bocchan', 'meros', 'rashomon'])
values()
ではすべての値を取得できます.これは辞書に対して繰り返し処理を行う際などに利用されます.
novels.values()
dict_values(['どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。', '親譲の無鉄砲で小供の時から損ばかりしている。', 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。', 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。'])
items()
ですべてのキーと値を取得できます.これは辞書に対して繰り返し処理を行う際などに利用されます.
novels.items()
dict_items([('genji', 'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。'), ('bocchan', '親譲の無鉄砲で小供の時から損ばかりしている。'), ('meros', 'メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。'), ('rashomon', 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。')])
上で説明したとおり,特定の要素を取り出すには次のようにキーを指定すると良いでしょう.
novels['genji']
'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。'
しかし,この方法ではキーが存在しない場合にエラーが生じ,プログラムが強制終了してしまいます.
novels['ginga']
-------------------------------------------------- KeyError Traceback (most recent call last)
強制終了させないためには上の方法により,キーがあるかどうかを予めチェックする方法と,get()
を使う方法があります.キーがある場合は get()
もこれまでと同じ動作をします.
novels.get('genji')
'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。'
キーが存在しなければ結果は None
となり,プログラムの処理は強制終了せずに(続きがあれば)継続されます.
novels.get('ginga')
(何も表示されない)
また,キーが見つからない場合に返す値を指定することもできます.
novels.get('genji', '見つかりません')
'どの天皇様の御代であったか、女御とか更衣とかいわれる後宮がおおぜいいた中に、最上の貴族出身ではないが深い御愛寵を得ている人があった。'
novels.get('ginga', '見つかりません')
'見つかりません'
clear()
ですべての要素を削除できます.
novels.clear()
novels
{}
print()
を使って辞書を表示したとき,必ずしも見やすい形式で表示される訳ではありません.
novels = {
"genji" : "どの天皇様の御代であったか",
"bocchan" : "親譲の無鉄砲で",
"meros" : "メロスは激怒した。",
"rashomon" : "ある日の暮方の事である。",
}
print(novels)
{'genji': 'どの天皇様の御代であったか', 'bocchan': '親譲の無鉄砲で', 'meros': 'メロスは激怒した。', 'rashomon': 'ある日の暮方の事である。'}
pprint()
使うと読みやすく整形して表示してくれます.なお,辞書以外にも様々なオブジェクトについて見やすく表示できます.
from pprint import pprint
novels = {
"genji" : "どの天皇様の御代であったか",
"bocchan" : "親譲の無鉄砲で",
"meros" : "メロスは激怒した。",
"rashomon" : "ある日の暮方の事である。",
}
pprint(novels)
{'bocchan': '親譲の無鉄砲で', 'genji': 'どの天皇様の御代であったか', 'meros': 'メロスは激怒した。', 'rashomon': 'ある日の暮方の事である。'}