Pythonで辞書に要素を追加・更新
Pythonで、辞書(dict
)に新たな要素(キーkey
と値value
)を追加したり、既存の要素の値を更新したりする方法を説明する。
辞書に辞書を追加する(複数の辞書を結合する)方法や、辞書から要素を削除する方法、キーの名前を変更する方法については以下の記事を参照。
- 関連記事: Pythonで辞書同士を結合(連結・マージ)
- 関連記事: Pythonで辞書の要素を削除するclear, pop, popitem, del
- 関連記事: Pythonで辞書のキー名を変更
辞書に一つの要素を追加・更新
以下の書き方で辞書の要素を追加・更新できる。
辞書オブジェクト[キー] = 値
存在しないキーを指定すると新たな要素が追加され、存在するキーを指定すると既存の値が更新(上書き)される。
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'
複数の辞書を結合(連結、マージ)する方法についての詳細は以下の記事を参照。
- 関連記事: Pythonで辞書同士を結合(連結・マージ)