環境設定 数値 文字列 正規表現 リスト タプル 集合 辞書 ループ 関数 クラス データクラス 時間 パス ファイル スクレイピング その他

Pythonの辞書に要素を追加(結合・連結)する:updateと上書き禁止のsetdefaultを使いこなそう

最終更新日 2023.02.18

Python では辞書のキーに値を入れると、その辞書にキーと値のペアが追加されます。

a = {'Apple': 'Mac', 'Microsoft': 'Windows'}
b = {'apple': 3, 'lemon': 7, 'peach': 1}

a['Google'] = 'Android'
b['banana'] = 8

print(a)
print(b)

# {'Apple': 'Mac', 'Microsoft': 'Windows', 'Google': 'Android'}
# {'apple': 3, 'lemon': 7, 'peach': 1, 'banana': 8}

この書き方で上書きもできます。

a = {'Apple': 'Mac', 'Microsoft': 'Windows'}

a['Microsoft'] = 'XBOX'

print(a)
# 'Apple': 'Mac', 'Microsoft': 'XBOX'}

上書きできるということは、辞書のペアはある意味で保存できないことを意味します。

update のキーワード引数を使う

update は特殊な関数で、キーワード引数に入れた値がペアになって結合します。

d = {'A': 1, 'B': 2}

d.update(C=3)

print(d)
# {'A': 1, 'B': 2, 'C': 3}

引数に辞書を入れることもできます。

d = {'A': 1, 'B': 2}

d.update(P='Python', Q=-1, R={'Z': 3})

print(d)
# {'A': 1, 'B': 2, 'P': 'Python', 'Q': -1, 'R': {'Z': 3}}

複数のペアを同時に結合できるうえに、視認性もいいため、辞書にペアを追加するときは update を使うといいでしょう。ちなみに下のコードは誤りです。

d.update('P'='Python', Q=-1, R={'Z': 3})

キーにクォーテーションを入れてはいけません。update は上書きもできます。

d = {'A': 1, 'B': 2}

d.update(A='Apple', Q=-1, R={'Z': 3})

print(d)
# {'A': 'Apple', 'B': 2, 'Q': -1, 'R': {'Z': 3}}

A の値が 1 から Apple になりました。

update で辞書に辞書を結合(連結)させる

辞書に辞書を追加するときも update を使います。

a = {'Apple': 'Mac', 'Microsoft': 'Windows'}
b = {'apple': 3, 'lemon': 7, 'peach': 1}

a.update(b)

print(a)
# {'Apple': 'Mac', 'Microsoft': 'Windows', 'apple': 3, 'lemon': 7, 'peach': 1}

a の後ろに b が連結されました。

setdefault でペアを追加する

Python プログラマーでも setdefault を知っている人は少ないかもしれません。setdefault はペアを追加する関数ですが、他の関数とふるまいが違います。

a = {'p': 1, 'q': 2}

a.setdefault('r', 3)

print(a)
# {'p': 1, 'q': 2, 'r': 3}

a.setdefault('r', 4)
print(a)
# {'p': 1, 'q': 2, 'r': 3}

a.setdefault('p', 100)
print(a)
# {'p': 1, 'q': 2, 'r': 3}

最初に r: 3 というペアを追加していますが、続いて r: 4 を追加しても変更されていません。また p: 100 も変更されていません。setdefault は、追加するキーがなかったら追加し、すでにキーがあったらなにもしない関数です。

他のやり方は、追加したいキーがすでにあると上書きします。この意味で setdefault は辞書を「保存」したまま追加する関数といえるでしょう。

setdefault の第二引数になにも入れないと、自動的に None が値になります。

a = {'p': 1, 'q': 2}

a.setdefault('r')

print(a)
# {'p': 1, 'q': 2, 'r': None}

a.setdefault('r', 100)

print(a)
# {'p': 1, 'q': 2, 'r': None}

上のコードからわかるように、None が入ったペアも変更できません。

ここからがやっかいなポイントです。setdefault の第二引数を省略すると、setdefault は第一引数をキーとするペアを探し、その値を返します。

a = {'p': 1, 'q': 2}

a.setdefault('r')

print(a)
# {'p': 1, 'q': 2, 'r': None}

p = a.setdefault('p')
q = a.setdefault('q')
r = a.setdefault('r')

print(p)  # 1
print(q)  # 2
print(r)  # None

つまり第二引数を省略すると setdefault は次のように動作します。

  • 第一引数がキーにあったら、その値を返す
  • 第一引数がキーになかったら、「第一引数をキー、None を値」とするペアを辞書に追加する

setdefault は上書きしないため、中身を保存する必要があるときは update よりも setdefault を積極的に使うべきです。