dict(辞書)の使い方
dict
は 辞書
とも呼ばれ, Perlでは ハッシュ
や 連想配列
, Rubyでは ハッシュ(Hash)
, と呼ばれているキーに紐付けて値を管理できるデータ構造。
新しいdictを作る
組み込みの文法による {}
と dict
クラスのコンストラクタを読んで作る方法がある。
new_dict1 = {}
new_dict_with_value1 = {"key1": 123, "key2": 234}
new_dict2 = dict()
new_dict_with_value2 = dict(key1=123, key2=234)
# dict()の場合キーワード引数がキーになるので文法上の制約がある
# 文法エラーになってしまう例(キー111がキーワード引数の名前として不正)
dict_syntax_err = dict(111=222)
新しいエントリを登録する / キーに対応する値を覚えさせる
dict1 = {}
dict1["new_key"] = "new_value"
# あるキーに対して値はひとつしか存在できないので同じキーに
# 値を再度セットすると上書きされる
dict1["new_key"] = "uwagaki-value"
エントリを順番に処理する
items()
メソッドを使うとキーと値のペアを順番に返してくれるイテレータを得ることができるのでこれを for
で順番に処理する。
d1 = {"k1": 1, "k2": 2, "k3": 3}
for key, value in d1.items():
print("key=%s, value=%s" % (key, value))
Python3.7以降ではキー/値のペアが出てくる順番はdictに挿入された順序になっている。(デフォルトで OrderedDict
になっている)
キーの一覧を得る
keys()
メソッドを呼ぶとキーを順番に返すイテレータが得られる。
d1 = {"k1": 1, "k2": 2, "k3": 3}
# 順番に処理する場合
for key in d1.keys():
print(key)
# listとしてほしい場合, keys()はイテレータなのでlist()で変換
key_list = list(d1.keys())
Python3.7以降ではキーが出てくる順番はdictに挿入された順序になっている。(デフォルトで OrderedDict
になっている)
値の一覧を得る
d1 = {"k1": 1, "k2": 2, "k3": 3}
# 順番に処理する場合
for value in d1.values():
print(value)
# listとしてほしい場合, values()はイテレータなのでlist()で変換
value_list = list(d1.values())
Python3.7以降では値が出てくる順番はdictに挿入された順序になっている。(デフォルトで OrderedDict
になっている)
キーと値のペアの一覧を得る
順番に処理する、の項で紹介した items()
がキーと値のペアの tuple
を返すイテレータになっているので、これを使う。
d1 = {"k1": 1, "k2": 2, "k3": 3}
# items()はイテレータを返すので, listとして欲しい場合はlist()で変換
entry_list = list(d1.items())
dictからキー(エントリ)を削除する
文法 del
を使うか、 pop()
メソッドを使う。 pop()
は引数のキーに対応した値を返す。
d1 = {"k1": 1, "k2": 2, "k3": 3}
# 文法 del で削除する
del d1["k1"]
del d1["unexistent_key"] # => 存在しないキーは例外KeyErrorが送出される
# popメソッドで削除する
print(d1.pop("k2")) #=> 2
dictの要素数(キーの数, エントリ数)を得る
組み込み関数 len()
で要素数を得ることができる。
d1 = {"k1": 1, "k2": 2, "k3": 3}
print(len(d1)) #=> 3
# 以下も同じこと
print(len(d1.keys())) #=> 3 キーで数える
print(len(d1.values())) #=> 3 値で数える
print(len(d1.items())) #=> 3 キー/値ペアで数える
dictにあるキーが存在するかどうか調べる
in
演算子を使うことで調べられる。真偽値( bool
型, True
または False
)の値が得られる。
d1 = {"k1": 1, "k2": 2, "k3": 3}
check_k4 = "k4" in d1 #=> False
if "k2" in d1:
print("k2 is in d1") #=> 出力される
dictの中身をすべて消去する
clear()
メソッドを呼ぶと含まれているエントリがすべてなくなる。
d1 = {"k1": 1, "k2": 2, "k3": 3}
# すべて消去
d1.clear()
print(len(d1)) #=> 0
dictに別のdictのエントリをすべて追加する
update()
メソッドで別のdictのエントリをすべて追加できる。同じキーがあった場合 update()
の引数に指定した別の dict
の内容で上書きされる
d1 = {"k1": 1, "k2": 2, "k3": 3}
d2 = {"k1": 111, "k4": 4, "k5": 5}
# d2の内容をすべて追加
d1.update(d2)
print(len(d1)) #=> 5 (k1, k2, k3, k4, k5 の5エントリ)
print(d1["k1"]) #=> 111 (d2の内容で上書きされている)