リテラル
辞書(dictionary)の要素はキーと値のセットで保持される。辞書の要素はリストのような順序を持たない(さらに言えば、このコードを実行するごとに表示される順番が変わる)。
1 2 |
dct = {'John':32, 'Bill':28, 'Luice':35} print(dct) # {'John': 32, 'Luice': 35, 'Bill': 28} |
キーや値の型は混在しても構わない。
1 2 |
dct = {'one':1, 2:'two', 'three': [3, 3]} print(dct) # {'three': [3, 3], 2: 'two', 'one': 1} |
キーについて
キーに使える型は、数値、文字列、タプルなど内容を変更できない型。
1 2 3 4 |
alpha = {1: 'A', 2: 'B', 3: 'C'} area = {(10, 20): 'Asia', (40, 30): 'Europe'} print(alpha[2]) # B print(area[(10, 20)]) # Asia |
数値や文字を格納した変数をキーに指定すると、変数の内容がキーになる。
1 2 3 4 |
var1 = 1 var2 = 'a' dct = {var1:11, var2:'aa'} print(dct) # {1: 1, 'a': 'aa'} |
既存のキーに新たな要素を定義しようとすると、[最後に指定したキー]:[値]のペアになる(1つのキーには1つの値しか格納されない)。
1 2 3 |
dct = {'A':1, 'B':2, 'B':'two'} print(dct) # {'B': 'two', 'A': 1} # {'A': 1, 'B': 'two'}となることもある |
リストやリストを含む変数、タプルをキーに使うとTypeErrorとなる。
1 2 3 4 5 6 |
# 以下は全てエラー # TypeError: unhashable type: 'list' dct = {[1, 2]:'list'} dct = {(0, [1, 2]): 'list'} lst = [1, 2] dct = {lst:'list'} |
内容の取得
要素数
辞書が持っている要素の数はlen()関数で得られる。
1 2 |
dct = {'A': 'a', 'B': 'b', 'C': 'c'} print(len(dct)) # 3 |
全てのキー・値・要素
辞書内の全てのキー、値、要素は、それぞれkeys()
、values()
、items()
で取得。結果はdict_keys
、dict_values
、dict_items
オブジェクトで得られ、list()
関数でリスト化が可能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
dct = {'A': 'a', 'B': 'b', 'C': 'c'} print(dct.keys()) print(dct.values()) print(dct.items()) print() print(list(dct.keys())) print(list(dct.values())) print(list(dct.items())) # dict_keys(['A', 'B', 'C']) # dict_values(['a', 'b', 'c']) # dict_items([('A', 'a'), ('B', 'b'), ('C', 'c')]) # # ['A', 'B', 'C'] # ['a', 'b', 'c'] # [('A', 'a'), ('B', 'b'), ('C', 'c')] |
要素の操作
要素の参照、追加
値の参照はキーを指定して行う。存在しないキーを指定して参照するとKeyError。
1 2 3 |
t = {'one': 1, 'two': 2, 'three': 3} print(dct['two']) # 2 print(dct['four']) # KeyError |
要素の追加は、新たなキーを指定して値を代入。
1 2 3 |
ct = {'one':1, 'two':2} dct['three'] = 3 print(dct) # {'two': 2, 'one': 1, 'three': 3} |
既存のキーを指定して、その内容を更新。
1 2 3 |
dct = {'one':1, 'two':2, 'three': 3} dct['two'] = 'second' print(dct) # {'one': 1, 'two': 'second', 'three': 3} |
要素の削除
del文/del()関数
del
文/del()
関数はキーを指定して要素を削除する。
1 2 3 4 |
dct = {'one': 1, 'two': 2, 'three': 3} del dct['two'] del(dct['three']) print(dct) # {'one': 1} |
pop()メソッド
pop()
メソッドは、引数で指定した要素を削除し、そのオブジェクトを返す。第2引数を指定した場合、キーが存在しないときに第2引数を返す。
1 2 3 4 5 6 7 8 9 10 |
dct = {'one': 1, 'two': 2, 'three': 3} print(dct.pop('three')) print(dct) # print(dct.pop('three')) 要素が存在しないときはKeyError print(dct.pop('three', False)) # 実行結果 # 3 # {'one': 1, 'two': 2} # False |
clear()メソッド
clear()
メソッドは辞書をすべてクリアする。
1 2 3 |
dct = {'one': 1, 'two': 2} dct.clear() print(dct) # {} |
存在確認
キーの存在確認
辞書が指定したキーを持つかどうかをチェックするにはin
演算子を使う。直接辞書に適用してもkeys()
に適用しても結果は同じ。Python3ではhas_key()
メソッドはなくなった。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
dct = {'one': 1, 'two': 2, 'three': 3} print('two' in dct) print('four' in dct) print() print('two' in dct.keys()) print('four' in dct) # print('two' in dct) # print('four' in dct) # print() # print('two' in dct.keys()) # print('four' in dct) |
値の存在確認
辞書が指定した値を持つかどうかは、in
演算子にvalues()
を適用
1 2 3 4 5 |
print('two' in dct.keys()) print('four' in dct) # True # False |
辞書オブジェクトの操作
辞書同士の連結
update()
メソッドで他の辞書を連結できる。この操作は、元の辞書の内容を更新する。
1 2 3 4 |
this_dict = {'one': 1, 'two': 2} other_dict = {'three': 3, 'four': 4} this_dict.update(other_dict) print(this_dict) # {'two': 2, 'four': 4, 'one': 1, 'three': 3} |
ただし元の辞書と追加する辞書で重複するキーがあった場合は、追加する方の辞書の要素で上書きされる。
複数の値を持つ辞書
通常は重複したキーに値を登録すると、最後に登録した値で上書きされて1つしか残らないが、値をリストにすることで、同じキーに複数の値をもたせることができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
dct = {} dct['one'] = [] dct['one'].append(1) dct['two'] = [] dct['two'].append('2') dct['two'].append('second') print(dct) for itm in dct.items(): print(itm[0], end=": ") for val in itm[1]: print(val, end=" ") print() # {'one': [1], 'two': ['2', 'second']} # one: 1 # two: 2 second |