note.nkmk.me

Pythonで辞書に要素を追加、辞書同士を連結(結合)

Posted: 2018-04-13 / Modified: 2021-09-17 / Tags: Python, 辞書

Pythonで辞書(dict型オブジェクト)に新たな要素を追加したり、既存の要素の値を更新したりする方法を説明する。複数の辞書を連結(結合、マージ)することも可能。

  • キーを指定して辞書に要素を追加・更新
  • 複数の辞書を連結(結合、マージ): update(), {}, dict(), |, |=演算子
  • 複数の要素を追加・更新: update(), |=演算子

辞書から要素を削除する方法や、キーkeyの存在を確認する方法、キーの名前を変更する方法については以下の記事を参照。

スポンサーリンク

キーを指定して辞書に要素を追加・更新

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

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

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

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(), {}, dict(), |, |=演算子

update()

辞書オブジェクトのメソッド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

後述のようにupdate()ではキーワード引数(key=value)として新たな要素を追加できるので、辞書に**をつけてそれぞれの要素をキーワード引数として展開して渡せばよい。

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'

{}(Python3.5以降), dict()

これまでの例のように、update()を使うと元の辞書オブジェクトが更新される。

複数の辞書を結合して新たな辞書を生成したい場合、{**d1, **d2}(Python3.5から)またはdict(**d1, **d2)とする。例は辞書2つだが、3つ以上でもOK。

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

print({**d1, **d2})
# {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}

print(dict(**d1, **d2))
# {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}

dict(**d1, **d2)の場合、引数に指定する複数の辞書のキーが重複しているとエラーになる({**d1, **d2}はOK)。

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

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

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

辞書の生成についての詳細は以下の記事を参照。

Python3.9以降は次に説明する|演算子で新たな辞書を生成することもできる。

|演算子, |=演算子(Python3.9以降)

Python3.9から|演算子で2つの辞書を連結(マージ)できるようになった。同じキーがある場合は右側の値が優先される。

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

d = d1 | d2
print(d)
# {'k1': 100, 'k2': 2, 'k3': 3, 'k4': 4}

d = d2 | d1
print(d)
# {'k1': 1, 'k3': 3, 'k4': 4, 'k2': 2}

|演算子を連続して使って複数の辞書を結合することも可能。

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

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

+における+=のように、|=演算子で累算代入もできる。update()と同様に、左辺のオブジェクトが更新される。

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

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

複数の要素を追加・更新: 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}

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}

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()は重複したキーでもOK。後ろの要素の値で上書きされる。

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

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

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}

|=演算子(Python3.9以降)

|=演算子では(key, value)のリストを右辺に指定できる。

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

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

|演算子ではリストを指定するとエラーになるので注意。辞書同士の演算のみがサポートされている。

# d | [('k1', 100), ('k3', 3), ('k4', 4)]
# TypeError: unsupported operand type(s) for |: 'dict' and 'list'
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事