note.nkmk.me

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

Posted: 2018-04-13 / Modified: 2021-01-02 / Tags: Python, 辞書

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

  • キーを指定して辞書に要素を追加・更新
  • 複数の辞書を連結(結合、マージ): update(), |演算子, |=演算子
  • 複数の要素を追加・更新: 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(), |演算子, |=演算子

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 = {'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)として新たな要素を追加できるので、辞書に**をつけてそれぞれの要素をキーワード引数として展開して渡せばOK。

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

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

複数の辞書を結合して新たな辞書を生成したい場合、{**d1, **d2}(Python3.5から)またはdict(**d1, **d2)とする。詳細は以下の記事を参照。

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

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

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

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

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

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

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

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

print(d1 | d2 | d3)
# {'k1': 1, '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}

zip()関数については以下の記事を参照。

|=演算子(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}

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

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

関連カテゴリー

関連記事