Pythonクックブック(4章)

ディクショナリの操作(作成、検索、追加)

ディクショナリの作成は、dict()を使うことで、keyとvalueのシーケンスから行える。
おかげで、{'key':'value'}の構文を使用しなくても済む。

また、存在しないキーに対する検索でもKeyError例外を出さないようにするには、get()メソッドが便利。
存在しなければ決まった文字列を返すように出来ている。
追加はsetdefaultメソッドが便利。get同様に検索用に使うが、キーが存在しなければ初期値を設定できる。

>>> colors = ['red', 'green', 'blue']
>>> values = [(255, 0, 0), (0, 255, 0), (0, 0, 255)]
# zip()で色とRGBパラメータのシーケンスを生成し、ディクショナリを作成
>>> rgb_dict = dict(zip(colors, values))
>>> rgb_dict
{'blue': (0, 0, 255), 'green': (0, 255, 0), 'red': (255, 0, 0)}
# 存在しないキーには初期値を設定し、設定した値を返す
>>> rgb_dict.setdefault('black', (0, 0, 0))
(0, 0, 0)
>>> rgb_dict.setdefault('white', (255, 255, 255))
(255, 255, 255)
>>> rgb_dict
{'blue': (0, 0, 255), 'black': (0, 0, 0), 'white': (255, 255, 255), 'green': (0, 255, 0), 'red': (255, 0, 0)}
>>> rgb_dict.setdefault('yellow', (255, 255, 0))
(255, 255, 0)
>>> rgb_dict
{'blue': (0, 0, 255), 'yellow': (255, 255, 0), 'black': (0, 0, 0), 'green': (0, 255, 0), 'white': (255, 255, 255), 'red': (255, 0, 0)}
# 存在するキーの値は変更されない(既存の値が返される)
>>> rgb_dict.setdefault('black', (1, 1, 1))
(0, 0, 0)
>>> rgb_dict
{'blue': (0, 0, 255), 'yellow': (255, 255, 0), 'green': (0, 255, 0), 'black': (0, 0, 0), 'white': (255, 255, 255), 'red': (255, 0, 0)}
# 存在するキーには値を返す
>>> rgb_dict.get('yellow', 'not_found')
(255, 255, 0)
# 存在しないキーには、決められた値('not found')を返す
>>> rgb_dict.get('purple', 'not_found')
'not_found'
>>> 

getに似たpopというメソッドがあるが、こちらは文字通り値を検索してポップしてくれる。

ただ、setdefaultはハッシュテーブルなど、値が増えていくデータ構造をディクショナリで実現するときにこそ使うべき。

>>> hash_table = {}
>>> hash_table
{}
>>> hash_table.setdefault(1, []).append('egg')
>>> hash_table.setdefault(1, []).append('spam')
>>> hash_table.setdefault(2, []).append('bike')
>>> hash_table.setdefault(2, []).append('car')
>>> hash_table.setdefault(2, []).append('train')
>>> hash_table.setdefault(3, []).append('pc')
>>> hash_table.setdefault(3, []).append('printer')
>>> hash_table
{1: ['egg', 'spam'], 2: ['bike', 'car', 'train'], 3: ['pc', 'printer']}
>>> 
修正@07/18

実行結果は正しく行っているが、本文が正しくなかった。
(誤)
ディクショナリの作成は、dict()を使うことで、keyとvalueのシーケンスから行える。
(正)
ディクショナリの作成は、zip()/dict()を使うことで、keyとvalueのシーケンスから行える。


Python クックブック 第2版

Python クックブック 第2版