Python | データ構造:dict.keys

Python
スポンサーリンク

dict.keys の概要(キー一覧を“コピーせず”参照するビュー)

dict.keys は、辞書に存在する「キー」をまとめて参照するためのメソッドです。戻り値は dict_keys という“ビュー”で、辞書の内容をコピーせずに映し出します。for ループでの走査、存在確認、並べ替えや集合的な操作の出発点として使われます。

user = {"name": "Hanako", "age": 20, "city": "Tokyo"}
print(user.keys())            # dict_keys(['name', 'age', 'city'])
for k in user.keys():
    print(k)                  # name / age / city
Python

ビューの性質と挿入順(ここが重要)

変更が“即反映”され、軽量に扱える

dict.keys() は辞書の現在のキー集合を映すビューです。辞書を更新すると、ビューにも即時に反映されます。大量データでも余計なコピーが発生しないため、ループや存在確認で効率的です。固定スナップショットが欲しい場合のみ list(…) でリスト化します。

d = {"a": 1}
keys_view = d.keys()
print(list(keys_view))  # ['a']

d["b"] = 2
print(list(keys_view))  # ['a', 'b']  ← 変更が反映
Python

挿入順を保つ(表示や出力で見通しが良い)

Python 3.7 以降、辞書は「挿入順」を保持します。keys() での走査順も挿入順です。別の順序(昇順・降順・値基準)で並べたい場合は、sorted(…) と組み合わせます。

d = {}
d["first"] = 1; d["second"] = 2; d["third"] = 3
print(list(d.keys()))                   # ['first', 'second', 'third']
print(sorted(d.keys()))                 # ['first', 'second', 'third'](キーの昇順)
Python

取り出し・並べ替え・存在確認(基本操作を押さえる)

リスト化・ソート・フィルタ

keys() はそのまま反復可能です。表示やソートしたいときだけ list(…) や sorted(…) を使います。

product = {"coffee": 350, "tea": 280, "juice": 220}

print(list(product.keys()))             # ['coffee', 'tea', 'juice']
for name in sorted(product.keys()):
    print(name, product[name])          # キー昇順で表示
Python

in で高速な存在確認

キーの存在チェックは最短で明快です。get と違い、辞書を読みに行くだけで副作用はありません。

conf = {"theme": "dark"}
if "theme" in conf:
    print(conf["theme"])
else:
    print("default")
Python

集合的な操作と応用(重要ポイントを深掘り)

dict_keys は“集合ライク”に比較できる

dict_keys はセット(集合)的な比較ができます。キーの差分・共通部分・包含関係を簡潔に表現できます(必要なら set(…) で本物の集合にして演算も可能)。

a = {"name": "Hanako", "age": 20}
b = {"name": "Hanako", "city": "Tokyo"}

print(a.keys() & b.keys())   # 共通キー → {'name'}
print(a.keys() - b.keys())   # aにのみある → {'age'}
print(b.keys() - a.keys())   # bにのみある → {'city'}
Python

スキーマ検証や不足項目の抽出

期待するキー集合との比較で、不足や余分を瞬時に洗い出せます。入力バリデーションの定番です。

required = {"name", "age", "email"}
payload  = {"name": "Taro", "age": 25}

missing = required - payload.keys()     # {'email'}
extra   = payload.keys() - required     # set()
print(missing, extra)
Python

実務パターン(ネスト構造・値基準の並べ替え)

ネスト辞書の安全な走査

上位のキーを列挙し、内側の辞書を安全に参照する流れが明快に書けます。

store = {
    "coffee": {"price": 350, "qty": 2},
    "tea":    {"price": 280, "qty": 1},
}
for name in store.keys():
    info = store[name]
    print(name, info["price"] * info["qty"])
Python

値でソートし、キーだけを取り回す

値に基づいて並べ替えたいときは items() を使ってキーを取り出し、キー列で操作します。

sales = {"coffee": 5, "tea": 1, "juice": 3}
for name, _ in sorted(sales.items(), key=lambda kv: kv[1], reverse=True):
    print(name)   # coffee / juice / tea
Python

落とし穴とベストプラクティス(使い分けの勘所)

keys() と items()/values() の選択

キーだけが必要なら keys()、値だけなら values()、両方使うなら items()。意図に合ったメソッドを選ぶとコードが読みやすくなります。

反復中の辞書更新は避ける

keys() で回している最中に同じ辞書へ追加・削除すると反復が乱れます。必要なら list(d.keys()) のスナップショットを回すか、結果を書き込む“別辞書”を用意します。

d = {"a": 1, "b": 2, "c": 3}
for k in list(d.keys()):
    if d[k] % 2 == 1:
        del d[k]
print(d)  # {'b': 2}
Python

表示順が欲しいなら自分で決める

dict_keys は順序を持つが、要件に合わせた順(辞書順、数値順、カスタム順)で表示したい場合は sorted(…) やキー関数を組み合わせて明示します。

conf = {"timeout": 0, "theme": "dark", "port": 8080}
for k in sorted(conf.keys(), key=str.lower):
    print(k, conf[k])
Python

例題で身につける(定番から一歩先まで)

例題1:キー一覧の取得とフォーマット表示

user = {"name": "Hanako", "age": 20, "city": "Tokyo"}
for k in user.keys():
    print(f"{k:<5} : {user[k]}")
Python

例題2:必須キーの検証と不足の報告

required = {"name", "age", "email"}
payload  = {"name": "Taro", "age": 25}
missing = required - payload.keys()
if missing:
    print("不足:", ", ".join(sorted(missing)))
Python

例題3:共通キーのみを抽出して新辞書を作る

base = {"host": "localhost", "port": 8000, "debug": True}
override = {"port": 8080, "debug": False, "mode": "prod"}

common = base.keys() & override.keys()
merged = {k: override[k] for k in common}
print(merged)  # {'port': 8080, 'debug': False}
Python

例題4:キーの自然順でレポート

prices = {"coffee": 350, "tea": 280, "juice": 220}
for name in sorted(prices.keys()):
    print(f"{name}: ¥{prices[name]}")
Python

まとめ

dict.keys は「辞書のキーをコピーせず参照するビュー」で、軽量に走査・存在確認・順序付き表示ができます。変更が即反映される性質を理解し、固定化が必要な場面だけリスト化する。集合ライクな比較で差分・共通を簡潔に表現し、要件に応じて sorted と組み合わせて表示順を決める。items/values との使い分け、反復中の更新回避を守れば、初心者でも読みやすく安全な辞書処理を書けます。

タイトルとURLをコピーしました