| この記事の要点 |
|
基本: 角括弧アクセス
d = {"name": "Taro", "age": 25, "city": "Tokyo"}
# キーが存在 → 値が返る
print(d["name"]) # 'Taro'
# キーが無い → KeyError 例外
print(d["email"])
# Traceback (most recent call last):
# ...
# KeyError: 'email'
「絶対に存在する」と保証できる場面 (直前で代入した、入力スキーマで検証済み) では d["key"] がもっとも素直で速い書き方です。
get() でデフォルト付き参照
d = {"name": "Taro"}
# キー無し → None
print(d.get("email")) # None
# デフォルトを指定
print(d.get("email", "未設定")) # 未設定
# get() は元の dict を変更しない
print(d) # {'name': 'Taro'}
Web リクエストや JSON など キーの有無が不確定なデータ を扱うときの定番。例外を握りつぶさず、明示的にデフォルト値を意識させるのが Pythonic です。
setdefault() で初期化付き参照
# 「キーが無ければデフォルト値で初期化して返す」
d = {}
d.setdefault("count", 0) # 0
d["count"] += 1 # → {'count': 1}
# 集約処理での定番
words = ["apple", "banana", "apple", "cherry"]
counts = {}
for w in words:
counts.setdefault(w, 0)
counts[w] += 1
# counts == {'apple': 2, 'banana': 1, 'cherry': 1}
# 辞書のリスト化
groups = {}
for x in [1, 2, 3, 4, 5]:
key = "even" if x % 2 == 0 else "odd"
groups.setdefault(key, []).append(x)
# groups == {'odd': [1, 3, 5], 'even': [2, 4]}
defaultdict — もっと楽な setdefault
from collections import defaultdict
# キー未存在時に自動で int() = 0 を作る
counts = defaultdict(int)
for w in ["a", "b", "a", "c", "a"]:
counts[w] += 1
# defaultdict(<class 'int'>, {'a': 3, 'b': 1, 'c': 1})
# キー未存在時にリストを作る
groups = defaultdict(list)
for k, v in [("odd", 1), ("even", 2), ("odd", 3)]:
groups[k].append(v)
# Counter — 出現回数集計の専用クラス
from collections import Counter
Counter(["a", "b", "a", "c", "a"])
# Counter({'a': 3, 'b': 1, 'c': 1})
Counter("mississippi").most_common(3)
# [('i', 4), ('s', 4), ('p', 2)]
in 演算子と KeyError 回避
d = {"name": "Taro", "age": 25}
# 存在チェック
if "name" in d:
print(d["name"])
# 否定
if "email" not in d:
print("メール無し")
# Python 2 では d.has_key("key") があったが、3 で廃止
# d.has_key("name") → AttributeError
items() / keys() / values() で反復
d = {"name": "Taro", "age": 25, "city": "Tokyo"}
# キーと値のペアで反復
for k, v in d.items():
print(f"{k} = {v}")
# name = Taro
# age = 25
# city = Tokyo
# キーだけ
for k in d.keys(): # for k in d: と同じ
...
# 値だけ
for v in d.values():
...
# items() はビュー — 元の dict が変わると追従する
view = d.items()
d["email"] = "taro@example.com"
list(view) # email も含まれる
Python 3.7 以降、dict は挿入順を保持します。items() も挿入順で返ります。
ネストした dict の値参照
data = {
"user": {
"name": "Taro",
"address": {"city": "Tokyo"}
}
}
# ❌ 途中のキーが無いと AttributeError / TypeError
city = data["user"]["address"]["city"]
# ✅ get() を連結 — どこかで None が返ったら止める
city = data.get("user", {}).get("address", {}).get("city")
# 安全だが冗長
# ✅ Python 3.13+ の Walrus 演算子と組み合わせ
if (user := data.get("user")) and (addr := user.get("address")):
city = addr.get("city")
# ✅ dpath / glom などのライブラリで安全アクセス
from glom import glom
city = glom(data, "user.address.city", default=None)
PHP の連想配列との比較
| 用途 | Python | PHP |
|---|---|---|
| キーで参照 | d["k"] (無いと KeyError) | $a["k"] (無いと Warning + null) |
| 安全参照 | d.get("k", default) | $a["k"] ?? default |
| 存在チェック | "k" in d | array_key_exists("k", $a) |
| キー反復 | for k in d | foreach ($a as $k => $v) |
FAQ
Q: d["key"] と d.get("key")、いつ使い分ける?
A: 存在を保証できるかで使い分けます。直前に d["key"] = ... したばかりなら角括弧、外部入力で不明なら get()。例外を握りつぶす目的で get() を使うのは避け、デフォルト値が業務的に意味を持つ場面で使ってください。
Q: setdefault と defaultdict、どちらが速い?
A: 大量のアクセスでは defaultdict が速いです。setdefault は呼ぶたびにデフォルト値を構築するためで、setdefault(k, []) のような重いデフォルトでは差が出ます。
Q: d.has_key("k") が AttributeError になる
A: Python 3 で廃止されました。"k" in d に置き換えてください。
子ページ
子ページはありません
同階層のページ
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Oracle 19cの索引再構築|REBUILDの判断・ONLINEと制約 2026-10-26 18:52:58
- Oracle 19cのCREATE INDEX|UNIQUE・BITMAP・TABLESPACE・ONLINEと製品比較 2026-10-26 18:52:56
- Oracle 19cの列定義変更|MODIFYの型・属性保持と既存NULL 2026-10-26 18:15:03
- Oracle 19cの列追加|ADD・DEFAULTと既存行・NOT NULLの条件 2026-10-26 18:15:03
- Oracle 19cのCREATE TABLE|型・制約・外部キーとCTASの注意点 2026-10-26 18:15:00
- Oracle 19cのDROP INDEX|制約依存・ONLINEとINVISIBLE 2026-10-26 17:21:20
- Oracle 19cのDROP TABLE|CASCADE・PURGEと復旧条件 2026-10-26 17:21:20
- Oracle 19cのカラム削除|DROP COLUMN・SET UNUSEDと依存・取消条件 2026-10-26 17:21:19
- Oracle 19cの索引操作|作成・再構築・削除と製品別の比較 2026-10-26 16:39:47
- Oracle 19cの表DDL|表操作の選び方とCREATE・ALTER・DROP・TRUNCATE 2026-10-26 16:39:47
- TRUNCATE TABLEの注意点|空の子表でも残る外部キーと製品別の取消条件 2026-10-26 16:39:45
- Oracle 19cのSAVEPOINT|部分ロールバック・COMMIT・DDLの境界 2026-10-26 15:51:40
- Oracle 19cのUPDATE文|更新件数・NULL・相関サブクエリ・MERGE 2026-10-26 15:51:40
- Oracle 19cのHAVING句|WHEREとの違い・NULL・集計条件 2026-10-26 15:51:40
- Oracleの制約|NOT NULL・UNIQUE・主キー・外部キー・CHECK 2026-10-26 15:51:38