【Python入門】辞書(dict)について,Python3

辞書型はリスト型に似ていますが、リスト型がオフセットで要素にアクセスできるのに対し、
辞書型はオフセットでは要素にアクセスできません。
代わりにキーを利用します。

リスト型では要素の順序自体にとても重要な意味を持っていますが、
辞書型では要素の順序は一定していません。

辞書は連想配列、ハッシュなどと呼ばれることもあります。
Pythonでは辞書、dictと呼ばれます。

{}で辞書を作成

>>> empty_dict = {}
>>> empty_dict
{}

>>> number_dict = {"1": "first","2": "second","3": "third",} #最後にカンマを残していてもかまわない
>>> number_dict
{'1': 'first', '2': 'second', '3': 'third'}

dict()で辞書へ変換

>>> sample_list = [[1, 2], [3, 4], [5, 6]]
>>> dict(sample_list) #辞書型にする
{1: 2, 3: 4, 5: 6}

>>> new_dict = dict(sample_list)
>>> new_dict[3] #3というキーで4を取り出す
4

>>> new_dict[4] #4は値であってキーではないので、例外発生
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 4
>>> list1 = [('a', 'b'), ('c', 'd'), ('e', 'f')]
>>> dict(list1)
{'a': 'b', 'c': 'd', 'e': 'f'}

>>> tuple1 = (['a', 'b'], ['c', 'd'], ['e', 'f'])
>>> dict(tuple1)
{'a': 'b', 'c': 'd', 'e': 'f'}

>>> list2 = ['ab', 'cd', 'ef']
>>> dict(list2)
{'a': 'b', 'c': 'd', 'e': 'f'}

>>> tuple2 = ('ab', 'cd', 'ef')
>>> dict(tuple2)
{'a': 'b', 'c': 'd', 'e': 'f'}

辞書の要素追加・変更

>>> sample_dict = {1: 2, 3: 4, 5: 6}
>>> sample_dict[7] = 8 #7というキーで値は8。これを辞書へ追加
>>> sample_dict
{1: 2, 3: 4, 5: 6, 7: 8}

>>> sample_dict[1] = 9 #1というキーの値は2だったが、9へ書き換え
>>> sample_dict
{1: 9, 3: 4, 5: 6, 7: 8}

辞書の結合

>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> dict2 = {'d': 4, 'e': 5, 'f': 6}
>>> dict1.update(dict2)
>>> dict1
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
>>> dict2
{'d': 4, 'e': 5, 'f': 6}

>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> dict3 = {'a': 4, 'e': 5, 'f': 6}
>>> dict1.update(dict3) #キーがかぶっている時は、2個目の辞書の値にアップデート(この場合dict3)
>>> dict1
{'a': 4, 'b': 2, 'c': 3, 'e': 5, 'f': 6}
>>> dict3
{'a': 4, 'e': 5, 'f': 6}

辞書の要素を削除

>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> del dict1['a']
>>> dict1
{'b': 2, 'c': 3}

辞書のすべての要素を削除

>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> dict1.clear()
{}

>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> dict1 = {}
>>> dict1
{}

辞書に特定のキーが含まれているかのチェック

>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> 'a' in dict1
True
>>> 'd' in dict1
False

辞書の要素を取得

>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> dict1['a']
1

>>> dict1.get('a')
1

>>> dict1.get('d', 'dっていうキーはないよ') #キーがない場合にオプションを返す
'dっていうキーはないよ'

>>> dict1.get('d') #オプションを指定せずキーが存在しなければNoneを返す
>>> (対話インタープリタには何も表示されない)

辞書のキーを全て取得

>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> dict1.keys() #keys()はdict_keys()を返す。使わないかもしれないリスト化を避けている
dict_keys(['a', 'b', 'c'])

>>> list(dict1.keys()) #すべてのキーをリストとして取得したい時
['a', 'b', 'c']

辞書の値を全て取得

>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> dict1.values()
dict_values([1, 2, 3])

>>> list(dict1.values()) #keys()の時と同じ。リスト化にはlist()
[1, 2, 3]

全てのキー・値のペアを取得

>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> dict1.items() #タプルで取り出される
dict_items([('a', 1), ('b', 2), ('c', 3)])

>>> list(dict1.items()) #list()でリスト化
[('a', 1), ('b', 2), ('c', 3)]

=による代入、copy()によるコピー

>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> dict2 = dict1
>>> dict1['a'] = 4
>>> dict2
{'a': 4, 'b': 2, 'c': 3}
>>> dict1
{'a': 4, 'b': 2, 'c': 3}
>>> dict1 = {'a': 1, 'b': 2, 'c': 3}
>>> dict2 = dict1.copy()
>>> dict1['a'] = 4
>>> dict2 #dict1の変更に影響されていない
{'a': 1, 'b': 2, 'c': 3}
>>> dict1
{'a': 4, 'b': 2, 'c': 3}

辞書のキーと値を入れ替える、交換する

>>> a_dic = {'a': 1, 'b': 2}
>>> b_dic = {v: k for k, v in a_dic.items()}
>>> b_dic
{1: 'a', 2: 'b'}

辞書を値でソートしてリスト化,昇順,降順

たとえば値が数値で、数値の大小を比較してなおかつ辞書のキー値の組み合わせも保持したい場合。
リスト化して、組み合わせはタプルで管理。
sorted()を使い、どんな風にソートするかをkeyでlambdaを指定。
reverse=Trueで降順にする。何も指定しないデフォルトは昇順。

>>> students = {"佐藤": 89, "鈴木": 50, "渡部": 100, "斎藤": 82, "相沢": 71,
...             "倉田": 90, "高橋": 32, "田中": 51, "森井": 94, "尾高": 59}
>>> slist = sorted(students.items(), key=lambda x: x[1], reverse=True)
>>> print(slist)
[('渡部', 100), ('森井', 94), ('倉田', 90), ('佐藤', 89), ('斎藤', 82), ('相沢', 71), ('尾高', 59), ('田中', 51), ('鈴木', 50), ('高橋', 32)]

辞書にメソッドや関数を入れて、文字列で呼び出す

関数を辞書に格納する

>>> def func1():
...     print('I am func1')
... 
>>> def func2():
...     print('I am func2')
... 
>>> dispatch = {'one': func1, 'two': func2}
>>> dispatch['one']()
I am func1
>>> dispatch['two']()
I am func2