Pythonで辞書にキーが存在しないときのみ要素を追加するsetdefault

Pythonの辞書(dictオブジェクト)では辞書オブジェクト[キー] = 新たな値で新たな要素を追加できます。この方法では、キーkeyがすでに存在している場合、値valueが新たな値に更新(上書き)されます。 setdefault()メソッドを使うことで、既存のキーに対しては値を変更せず、新規のキーに対してのみ新たな値で要素を追加できます。

組み込み型 dict.setdefault() — Python 3.7.1rc1 ドキュメント

すでに存在している要素を変更したくない場合に便利です。 ここでは以下の内容について説明します。

キーを指定して辞書に要素を追加・更新 setdefault()メソッドの使い方 setdefault()メソッドの返り値

なお、辞書に特定のキーが存在しているかどうかを判定するにはinを使います。

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

以下の書き方で辞書の要素を追加・更新できます。 辞書オブジェクト[キー] = 値

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

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()メソッドの使い方

辞書(dictオブジェクト)のsetdefault()メソッドでは、第一引数にキーkey、第二引数に値valueを指定します。 第一引数に指定したキーが存在しない場合、新たな要素が追加されます。

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

d.setdefault('k3', 3)
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3}

第二引数のデフォルト値はNone。省略すると値がNoneの要素が追加されます。

d.setdefault('k4')
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3, 'k4': None}

第一引数に指定したキーがすでに存在している場合は、第二引数にどんな値を指定しても元のオブジェクトのまま変更されません。

d.setdefault('k1', 100)
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3, 'k4': None}

setdefault()メソッドの返り値

setdefault()メソッドは、上述のように要素を追加する処理を行うとともに、第一引数に指定したキーに対応する値を返します。 第一引数に指定したキーが存在しない場合は、第二引数に指定した値で要素を追加した上で、その値が返されます。

print(d.setdefault('k5', 5))
# 5

print(d)
# {'k1': 1, 'k2': 2, 'k3': 3, 'k4': None, 'k5': 5}

第二引数を省略した場合はNoneを追加し、Noneを返します。

print(d.setdefault('k6'))
# None

print(d)
# {'k1': 1, 'k2': 2, 'k3': 3, 'k4': None, 'k5': 5, 'k6': None}

第一引数に指定したキーがすでに存在している場合は第二引数に何を指定しても既存のキーには影響しないため、そのキーに対するもともとの値が返されます。

print(d.setdefault('k1', 100))
# 1

print(d.setdefault('k1', -100))
# 1

print(d.setdefault('k1'))
# 1

print(d)
# {'k1': 1, 'k2': 2, 'k3': 3, 'k4': None, 'k5': 5, 'k6': None}
Last Updated: 6/26/2019, 10:34:03 PM