Pythonで辞書に要素を追加・更新

Modified: | Tags: Python, 辞書

Pythonで、辞書(dict)に新たな要素(キーkeyと値value)を追加したり、既存の要素の値を更新したりする方法を説明する。

辞書に辞書を追加する(複数の辞書を結合する)方法や、辞書から要素を削除する方法、キーの名前を変更する方法については以下の記事を参照。

辞書に一つの要素を追加・更新

以下の書き方で辞書の要素を追加・更新できる。

辞書オブジェクト[キー] = 

存在しないキーを指定すると新たな要素が追加され、存在するキーを指定すると既存の値が更新(上書き)される。

d = {'k1': 1, 'k2': 2}

d['k3'] = 3
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3}

d['k1'] = 100
print(d)
# {'k1': 100, 'k2': 2, 'k3': 3}

存在するキーの値を更新したくない(キーが存在しないときのみ要素を追加したい)場合はsetdefault()メソッドを使う。

辞書に複数の要素を追加・更新: update()

辞書のupdate()メソッドで、複数の要素を一度に追加・更新できる。

キーワード引数を指定

update()にキーワード引数key=valueを指定すると、キーkeyと値valueの要素が追加される。既存のキーと重複する場合は引数に指定した値で上書きされる。

d = {'k1': 1, 'k2': 2}

d.update(k1=100, k3=3, k4=4)
print(d)
# {'k1': 100, 'k2': 2, 'k3': 3, 'k4': 4}

引数に同じキーを指定するとエラーになる。

# d.update(k3=3, k3=300)
# SyntaxError: keyword argument repeated: k3

この方法でキーとして指定できるのは、引数名(識別子)として有効な文字列のみ。数字から始まったり、_以外の記号を含むものは使えない。

# d.update(k-3=3)
# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?

# d.update(4=400)
# SyntaxError: expression cannot contain assignment, perhaps you meant "=="?

他の方法であれば、識別子として無効な値もキーとして使用可能。

d = {'k1': 1, 'k2': 2}

d['k-3'] = 3
d[4] = 400
print(d)
# {'k1': 1, 'k2': 2, 'k-3': 3, 4: 400}

キーと値のペアのイテラブルを指定

update()には(key, value)のリストを引数として指定できる。既存のキーと重複する場合は引数に指定した値で上書きされる。

d = {'k1': 1, 'k2': 2}

d.update([('k1', 100), ('k3', 3), ('k4', 4)])
print(d)
# {'k1': 100, 'k2': 2, 'k3': 3, 'k4': 4}

上の例ではタプルのリストを指定したが、キーと値のペア(2要素のイテラブル)のイテラブルであればよい。例えばリスト[key, value]のタプルなどでもよい。

zip()関数を使うと、キーのリストと値のリストから要素を追加・更新できる。

d = {'k1': 1, 'k2': 2}

keys = ['k1', 'k3', 'k4']
values = [100, 3, 4]

d.update(zip(keys, values))
print(d)
# {'k1': 100, 'k2': 2, 'k3': 3, 'k4': 4}

(key, value)のリストやzip()を使う場合、引数に重複したキーを指定してもエラーにならない。後ろの要素の値で上書きされる。

d = {'k1': 1, 'k2': 2}

d.update([('k3', 3), ('k3', 300)])
print(d)
# {'k1': 1, 'k2': 2, 'k3': 300}
d = {'k1': 1, 'k2': 2}

keys = ['k3', 'k3']
values = [3, 300]

d.update(zip(keys, values))
print(d)
# {'k1': 1, 'k2': 2, 'k3': 300}

別の辞書を指定

さらに、update()には別の辞書を引数として指定できる。指定した辞書の要素がすべて追加・更新される。

d1 = {'k1': 1, 'k2': 2}
d2 = {'k1': 100, 'k3': 3, 'k4': 4}

d1.update(d2)
print(d1)
# {'k1': 100, 'k2': 2, 'k3': 3, 'k4': 4}

update()の引数に複数の辞書をそのまま指定するとエラーとなる。辞書に**をつけてそれぞれの要素をキーワード引数として展開して渡せばよい。

d1 = {'k1': 1, 'k2': 2}
d2 = {'k1': 100, 'k3': 3, 'k4': 4}
d3 = {'k5': 5, 'k6': 6}

# d1.update(d2, d3)
# TypeError: update expected at most 1 arguments, got 2

d1.update(**d2, **d3)
print(d1)
# {'k1': 100, 'k2': 2, 'k3': 3, 'k4': 4, 'k5': 5, 'k6': 6}

**を使う場合、上の例のように、呼び出し元の辞書と引数に指定する辞書のキーが重複しているのは問題ないが、引数に指定する複数の辞書のキーが重複しているとエラーになるので注意。

d1 = {'k1': 1, 'k2': 2}
d2 = {'k1': 100, 'k3': 3, 'k4': 4}
d3 = {'k5': 5, 'k6': 6}

# d3.update(**d1, **d2)
# TypeError: dict.update() got multiple values for keyword argument 'k1'

複数の辞書を結合(連結、マージ)する方法についての詳細は以下の記事を参照。

関連カテゴリー

関連記事