Pythonの辞書に要素を追加(結合・連結)する:updateと上書き禁止のsetdefaultを使いこなそう
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 を積極的に使うべきです。