Python辞書のsetdefault()メソッドでキーの初期値を設定する方法

Pythonで辞書を扱う際、「もしキーが存在しなかったら、デフォルト値(初期値)を設定する」という処理は非常によくあるパターンです。通常、これはif文を使って書くことができます。

# 設定を管理する辞書
config = {"user": "admin", "level": 5}

# "theme"というキーが存在しなければ、"light"をデフォルト値として設定
if "theme" not in config:
    config["theme"] = "light"

このコードは問題なく動きますが、Pythonにはこの処理をより簡潔に、一行で書くための**setdefault()メソッド**が用意されています。


目次

setdefault()メソッドでコードを簡潔にする

setdefault()メソッドは、キーが存在するかどうかをチェックし、存在しない場合のみ新しいキーとデフォルト値を追加します。

dictionary.setdefault(キー, デフォルト値)

このメソッドは、以下の2つの動作を一度に行います。

  1. 指定したキーが辞書に存在すれば、何もせずにそのキーの既存の値を返します
  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らしい効率的なコードを書きましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次