カネキン伊藤テック

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の内容で上書きされている)

参考リンク