Pythonのsetdefault()とは?使い方・get()との違いを初心者向けに解説

Pythonの辞書(dict)を扱っていると、「キーが存在しなければ初期値を設定したい」という場面があります。

このような処理に便利なのが、辞書のsetdefault()メソッドです。

setdefault()を使うと、キーが存在するときはその値を取得し、存在しないときは指定した値を登録して、その値を返すことができます。(Python documentation)

この記事では、Python初心者向けにsetdefault()の基本的な使い方から、get()との違い、リストと組み合わせた活用方法まで解説します。

setdefault()とは?

setdefault()は、Pythonの辞書(dict)で使えるメソッドです。

基本構文は次のとおりです。

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

例えば、次のように使います。

data = {"name": "田中"}

result = data.setdefault("name", "山田")

print(result)

実行結果:

田中

"name"というキーがすでに存在しているため、現在の値である"田中"が返されます。

辞書の中身も変わりません。

print(data)
{'name': '田中'}

キーが存在しない場合

setdefault()で指定したキーが辞書に存在しない場合は、デフォルト値が辞書に追加されます。

data = {"name": "田中"}

result = data.setdefault("age", 20)

print(result)
print(data)

実行結果:

20
{'name': '田中', 'age': 20}

"age"が存在しなかったため、

"age": 20

が辞書に追加されました。

つまりsetdefault()には、

  1. キーが存在する → 現在の値を返す

  2. キーが存在しない → デフォルト値を登録する

  3. 登録したデフォルト値を返す

という働きがあります。(Python documentation)

setdefault()のデフォルト値を省略する

デフォルト値は省略することもできます。

data = {}

result = data.setdefault("name")

print(result)
print(data)

実行結果:

None
{'name': None}

デフォルト値を指定しなかった場合はNoneが使われます。

そのため、次のコードと同じような結果になります。

data.setdefault("name")

↓

data.setdefault("name", None)

setdefault()で値を変更できる?

ここは初心者が間違えやすいポイントです。

すでにキーが存在している場合、setdefault()で指定したデフォルト値に置き換わるわけではありません。

data = {"name": "田中"}

data.setdefault("name", "山田")

print(data)

実行結果:

{'name': '田中'}

"name"はすでに存在しているため、"山田"には変更されません。

「キーがなければ追加する」というのがsetdefault()の重要なポイントです。

setdefault()の戻り値

setdefault()は、処理した値を返します。

例えばキーが存在する場合:

data = {"score": 80}

result = data.setdefault("score", 100)

print(result)
80

キーが存在しない場合:

data = {}

result = data.setdefault("score", 100)

print(result)
100

そのため、次のように戻り値をそのまま利用できます。

data = {}

score = data.setdefault("score", 100)

print(score)
100

setdefault()とget()の違い

setdefault()とよく比較されるのがget()です。

例えばget()の場合:

data = {}

result = data.get("name", "未登録")

print(result)
print(data)

実行結果:

未登録
{}

get()は値を取得するだけなので、辞書には"name"が追加されません。

一方、setdefault()では、

data = {}

result = data.setdefault("name", "未登録")

print(result)
print(data)

実行結果:

未登録
{'name': '未登録'}

となります。

get()とsetdefault()の違い

メソッド キーが存在する場合 キーがない場合 辞書を変更する
get() 値を返す デフォルト値を返す しない
setdefault() 値を返す デフォルト値を登録して返す する

「取得するだけ」ならget()、 「なければ登録したい」ならsetdefault()と覚えると分かりやすいでしょう。

setdefault()とif文の違い

setdefault()を使わずに書くと、次のような処理になります。

data = {}

if "name" not in data:
    data["name"] = "田中"

print(data)

setdefault()を使えば、次のように短く書けます。

data = {}

data.setdefault("name", "田中")

print(data)

どちらもキーが存在しなければ値を登録します。

ただし、処理の意図が複雑になる場合は、無理にsetdefault()を使わずif文で明示したほうが読みやすいこともあります。

setdefault()でリストを初期化する

setdefault()が特に便利なのが、辞書の値としてリストを用意する場合です。

例えば、カテゴリーごとにデータをまとめたいとします。

data = {}

data.setdefault("Python", []).append("入門")
data.setdefault("Python", []).append("関数")
data.setdefault("Django", []).append("Web開発")

print(data)

実行結果:

{
    'Python': ['入門', '関数'],
    'Django': ['Web開発']
}

この書き方では、

data.setdefault("Python", [])

によって"Python"が存在しなければ空のリストを作ります。

その後、

.append("入門")

によって値を追加しています。

Python公式ドキュメントでも、setdefault()を使ってキーごとにリストを作る方法が紹介されています。(GitHub)

setdefault()の実践例

例えば、商品をカテゴリーごとに分類するとします。

products = [
    ("PC", "MacBook"),
    ("PC", "ThinkPad"),
    ("スマホ", "iPhone"),
    ("スマホ", "Pixel")
]

result = {}

for category, product in products:
    result.setdefault(category, []).append(product)

print(result)

実行結果:

{
    'PC': ['MacBook', 'ThinkPad'],
    'スマホ': ['iPhone', 'Pixel']
}

このように、同じキーに複数の値をまとめたい場合にsetdefault()は便利です。

setdefault()とdefaultdict()の違い

同じような処理を何度も行う場合、collections.defaultdictを使う方法もあります。

from collections import defaultdict

result = defaultdict(list)

for category, product in products:
    result[category].append(product)

defaultdictは、存在しないキーにアクセスしたときにdefault_factoryから値を自動的に作成できます。Python公式ドキュメントでは、リストを使ったグループ化ではdefaultdictのほうがsetdefault()を使う方法よりシンプルで高速だと説明されています。(Python documentation)

そのため、

  • 1回程度の簡単な初期化 → setdefault()

  • 繰り返し辞書をグループ化する → defaultdict

という使い分けもできます。

setdefault()で注意したいこと

setdefault()では、デフォルト値の式がメソッド呼び出し前に評価される点に注意しましょう。

例えば、

data.setdefault("items", [])

では、[]自体はsetdefault()が呼ばれる前に作られます。

そのため、デフォルト値を作る処理が重い場合には注意が必要です。Pythonの公式Issueでも、setdefault()に遅延評価を追加する提案が検討されましたが、採用されていません。(Python Bug Tracker)

単純な[]や0、Noneなどであれば、通常はそれほど難しく考える必要はありません。

setdefault()のまとめ

Pythonのsetdefault()は、辞書にキーがなければデフォルト値を登録し、その値を返すメソッドです。

基本形は次のとおりです。

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

覚えておきたいポイントは次の3つです。

  • キーが存在すれば、その値を返す

  • キーがなければデフォルト値を登録する

  • get()とは違い、キーがなければ辞書の内容が変わる

特に、

data.setdefault("Python", []).append("入門")

のように、辞書の中にリストを作ってデータを分類する処理で活躍します。

setdefault()は、Pythonの辞書操作を簡潔に書くために覚えておきたいメソッドの一つです。


あわせて読みたい

setdefault()は、Pythonの辞書(dict)が持つメソッドの1つです。ほかの関数・メソッドとあわせて確認したい方は、次の一覧ページをご覧ください。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら