辞書.get() / 辞書.setdefault()
| 対応: | Python 2(2000) |
|---|
辞書から安全にキーを取得したり、キーが存在しない場合のデフォルト値を設定するメソッドです。『KeyError』を防ぐために重要です。
構文
# キーに対応する値を返します。キーが存在しない場合はデフォルト値を返します。 辞書.get(キー, デフォルト値=None) # キーが存在しない場合はデフォルト値を設定してから返します。キーが存在する場合は既存の値を返します。 辞書.setdefault(キー, デフォルト値=None)
関数一覧
| メソッド | 概要 |
|---|---|
| dict.get(key, default=None) | キーが存在する場合はその値を、存在しない場合は default を返します。辞書は変更されません。 |
| dict.setdefault(key, default=None) | キーが存在する場合はその値を返します。キーが存在しない場合は辞書に key: default を追加して default を返します。 |
サンプルコード
sample_dict_get_setdefault.py
# get() でキーが存在しなくてもエラーにならずに取得します。
person = {"name": "桐生一馬", "age": 37, "city": "神室町"}
# 存在するキーを取得します。
print(person.get("name")) # 桐生一馬
print(person.get("age")) # 37
# 存在しないキーを 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() で辞書の値にリストを使う定番パターンです。
# グループ分けに便利な「辞書の値がリスト」の実装です。
members_by_org = {}
items = [
("東城会", "桐生一馬"), ("近江連合", "冴島大河"), ("東城会", "錦山彰"),
("フリー", "真島吾朗"), ("近江連合", "堂島大吾")
]
for org, name in items:
members_by_org.setdefault(org, []).append(name)
print(members_by_org)
# {'東城会': ['桐生一馬', '錦山彰'], '近江連合': ['冴島大河', '堂島大吾'], 'フリー': ['真島吾朗']}
# 同じことを collections.defaultdict でも実現できます。
from collections import defaultdict
members_by_org2 = defaultdict(list)
for org, name in items:
members_by_org2[org].append(name)
print(dict(members_by_org2)) # 同じ結果になります。
# 名前の出現回数をカウントする例です。
names = ["Kiryu Kazuma", "Majima Goro", "Kiryu Kazuma", "Nishikiyama Akira", "Majima Goro", "Kiryu Kazuma"]
count = {}
for name in names:
count[name] = count.get(name, 0) + 1
print(count) # {'Kiryu Kazuma': 3, 'Majima Goro': 2, 'Nishikiyama Akira': 1}
python3 dict_get_setdefault.py
桐生一馬
37
None
未登録
000-0000
ログレベル: INFO
{'name': '真島吾朗', 'role': 'guest'}
{'name': '真島吾朗', 'role': 'guest'}
{'東城会': ['桐生一馬', '錦山彰'], '近江連合': ['冴島大河', '堂島大吾'], 'フリー': ['真島吾朗']}
{'東城会': ['桐生一馬', '錦山彰'], '近江連合': ['冴島大河', '堂島大吾'], 'フリー': ['真島吾朗']}
{'Kiryu Kazuma': 3, 'Majima Goro': 2, 'Nishikiyama Akira': 1}
概要
辞書の値を取得するとき、存在しないキーに『[]』でアクセスすると『KeyError』が発生します。キーが存在するかどうか不確かな場合は、必ず『get()』を使うか、事前に『in』演算子で確認してからアクセスしてください。
『setdefault()』と『get()』の最大の違いは、辞書を変更するかどうかです。『setdefault()』はキーが存在しない場合に辞書を変更してデフォルト値を登録します。これを利用して「初回アクセス時に空リストを設定し、以後その場所にデータを追加する」というパターンが頻繁に使われます。
単語のカウントや集計には、標準ライブラリの『collections.Counter』がより簡潔です。辞書の更新については『辞書.update() / 辞書.pop()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。