Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Python辞典

  1. トップページ
  2. Python辞典
  3. 辞書.get() / 辞書.setdefault()

辞書.get() / 辞書.setdefault()

辞書から安全にキーを取得したり、キーが存在しない場合のデフォルト値を設定するメソッドです。KeyError を防ぐために重要です。

構文
# キーに対応する値を返します。キーが存在しない場合はデフォルト値を返します。
辞書.get(キー, デフォルト値=None)

# キーが存在しない場合はデフォルト値を設定してから返します。キーが存在する場合は既存の値を返します。
辞書.setdefault(キー, デフォルト値=None)
関数一覧
メソッド概要
dict.get(key, default=None)キーが存在する場合はその値を、存在しない場合は default を返します。辞書は変更されません。
dict.setdefault(key, default=None)キーが存在する場合はその値を返します。キーが存在しない場合は辞書に key: default を追加して default を返します。
サンプルコード
# get() でキーが存在しなくてもエラーにならずに取得します。
person = {"name": "太郎", "age": 20, "city": "東京"}

# 存在するキーを取得します。
print(person.get("name"))   # 太郎
print(person.get("age"))    # 20

# 存在しないキーを get() で取得すると None が返ります。
print(person.get("email"))  # None

# デフォルト値を指定します。
print(person.get("email", "未登録"))    # 未登録
print(person.get("phone", "000-0000")) # 000-0000

# get() と [] の違いです。
# person["email"]  # KeyError が発生します。
# person.get("email")  # エラーなし、None を返します。

# 設定値を元に処理を分岐する実用例です。
config = {"debug": True, "timeout": 30}
log_level = config.get("log_level", "INFO")  # デフォルトは "INFO"
print(f"ログレベル: {log_level}")  # ログレベル: INFO

# setdefault() でキーが存在しない場合だけ値を設定します。
user = {"name": "花子"}
user.setdefault("role", "guest")  # "role" がないので設定されます。
print(user)  # {'name': '花子', 'role': 'guest'}

user.setdefault("role", "admin")  # "role" がすでにあるので変更されません。
print(user)  # {'name': '花子', 'role': 'guest'}(admin にならない)

# setdefault() で辞書の値にリストを使う定番パターンです。
# グループ分けに便利な「辞書の値がリスト」の実装です。
fruits_by_color = {}
items = [
    ("赤", "りんご"), ("黄", "バナナ"), ("赤", "いちご"),
    ("緑", "ぶどう"), ("黄", "レモン")
]
for color, fruit in items:
    fruits_by_color.setdefault(color, []).append(fruit)

print(fruits_by_color)
# {'赤': ['りんご', 'いちご'], '黄': ['バナナ', 'レモン'], '緑': ['ぶどう']}

# 同じことを collections.defaultdict でも実現できます。
from collections import defaultdict
fruits_by_color2 = defaultdict(list)
for color, fruit in items:
    fruits_by_color2[color].append(fruit)

print(dict(fruits_by_color2))  # 同じ結果になります。

# 単語の出現回数をカウントする例です。
words = ["apple", "banana", "apple", "cherry", "banana", "apple"]
count = {}
for word in words:
    count[word] = count.get(word, 0) + 1
print(count)  # {'apple': 3, 'banana': 2, 'cherry': 1}
概要

辞書の値を取得するとき、存在しないキーに『[]』でアクセスすると KeyError が発生します。キーが存在するかどうか不確かな場合は、必ず『get()』を使うか、事前に『in』演算子で確認してからアクセスしてください。

『setdefault()』と『get()』の最大の違いは、辞書を変更するかどうかです。『setdefault()』はキーが存在しない場合に辞書を変更してデフォルト値を登録します。これを利用して「初回アクセス時に空リストを設定し、以後その場所にデータを追加する」というパターンが頻繁に使われます。

単語のカウントや集計には、標準ライブラリの『collections.Counter』がより簡潔です。辞書の更新については『辞書.update() / 辞書.pop()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。