Pythonで辞書を扱う際、「もしキーが存在しなかったら、デフォルト値(初期値)を設定する」という処理は非常によくあるパターンです。通常、これはif
文を使って書くことができます。
# 設定を管理する辞書
config = {"user": "admin", "level": 5}
# "theme"というキーが存在しなければ、"light"をデフォルト値として設定
if "theme" not in config:
config["theme"] = "light"
このコードは問題なく動きますが、Pythonにはこの処理をより簡潔に、一行で書くための**setdefault()
メソッド**が用意されています。
目次
setdefault()
メソッドでコードを簡潔にする
setdefault()
メソッドは、キーが存在するかどうかをチェックし、存在しない場合のみ新しいキーとデフォルト値を追加します。
dictionary.setdefault(キー, デフォルト値)
このメソッドは、以下の2つの動作を一度に行います。
- 指定したキーが辞書に存在すれば、何もせずにそのキーの既存の値を返します。
- 指定したキーが辞書に存在しなければ、そのキーと指定されたデフォルト値を辞書に追加し、そのデフォルト値を返します。
先ほどのif
文の例は、setdefault()
を使うと以下のように書き換えられます。
config = {"user": "admin", "level": 5}
# "theme"キーがなければ、値"light"で設定
config.setdefault("theme", "light")
print(config)
# 出力: {'user': 'admin', 'level': 5, 'theme': 'light'}
# "user"キーは既に存在するので、辞書は変更されない
config.setdefault("user", "guest")
print(config)
# 出力: {'user': 'admin', 'level': 5, 'theme': 'light'}
一行でキーの存在確認と初期値設定が完了し、コードが非常にすっきりとしました。
実用例:文字の出現回数を数える
setdefault()
が特に活躍するのが、アイテムの出現回数を数えるような処理です。
以下のコードは、ある文章に含まれる各文字が、何回出現するかを数えるプログラムです。
sentence = "this is a simple sentence."
character_count = {}
for character in sentence:
# characterがキーとして存在しなければ、値に0を設定
character_count.setdefault(character, 0)
# characterに対応する値を1増やす
character_count[character] += 1
print(character_count)
コードの解説
for
ループが各文字を順番に見ていきます。
- 初めて見る文字の場合:
character_count
辞書にはその文字のキーはまだありません。setdefault(character, 0)
が実行されると、{"その文字": 0}
という新しいペアが辞書に追加されます。その直後に+= 1
の行が実行され、値が1
になります。 - 既に出てきた文字の場合:その文字のキーは既に辞書に存在します。
setdefault()
は何の変更も加えず、単に既存の値(現在のカウント数)を返すだけです。そして+= 1
の行が実行され、カウントが1つ増えます。
このように、setdefault()
を使うことで、キーの存在を毎回if
文でチェックする手間を省き、非常にエレガントに集計処理を実装できます。
まとめ
setdefault()
メソッドは、キーが存在しない場合にのみ、デフォルト値を設定します。if key not in dict:
という冗長なコードを、シンプルで読みやすい一行にまとめることができます。- 特に、要素の出現回数を数えたり、アイテムをグルーピングしたりする処理で非常に強力です。
setdefault()
を使いこなして、よりPythonらしい効率的なコードを書きましょう。