dict.items の概要(キーと値を同時に扱うための“ビュー”)
dict.items は、辞書の「キーと値のペア」をひとつずつ取り出すためのメソッドです。戻り値は dict_items という“ビューオブジェクト”で、辞書の中身をコピーせずに参照します。for ループで使うと、キーと値を同時に受け取れて、処理が短く明快になります。
user = {"name": "Hanako", "age": 20}
for key, value in user.items():
print(key, value)
# name Hanako
# age 20
Python基本の使い方と挙動(ここが重要)
dict_items は“ビュー”であり、辞書の変更を反映する
dict.items() が返す dict_items は、辞書の現在の内容を映すビューです。辞書を変更すると、ビューの内容も即座に変わります。大量データでもコピーコストが発生しないため効率的です。固定スナップショットが欲しい場合は list(…) でリスト化します。
d = {"a": 1}
view = d.items()
print(list(view)) # [('a', 1)]
d["b"] = 2 # 後から更新
print(list(view)) # [('a', 1), ('b', 2)] ← 変化を反映
Pythonキーと値のアンパックで読みやすく
for key, value in d.items(): の形で、ペアをその場でアンパックします。キーのみなら keys()、値のみなら values() を使いますが、実務では items() が最も多用されます。
for k, v in {"x": 10, "y": 20}.items():
print(f"{k} = {v}")
Python順序は「挿入順」を保つ(Python 3.7+)
辞書は挿入順を保持します。items() の走査もその順序で行われるため、表示や出力の見通しが良くなります。別順序が必要なら、sorted(d.items()) を使って並べ替えます。
d = {}
d["first"] = 1; d["second"] = 2; d["third"] = 3
print(list(d.items())) # [('first', 1), ('second', 2), ('third', 3)]
Python変換・並べ替え・フィルタ(実務でよく使う形)
リスト化・並べ替え・再構築
dict_items は必要に応じてリスト化できます。キーまたは値で並べ替え、辞書へ戻すことも簡単です。
product = {"coffee": 350, "tea": 280, "juice": 220}
pairs = list(product.items()) # リスト化
print(sorted(pairs)) # キーで昇順(タプルの辞書順)
print(sorted(product.items(), key=lambda kv: kv[1])) # 値で昇順
sorted_by_price_desc = dict(
sorted(product.items(), key=lambda kv: kv[1], reverse=True)
)
print(sorted_by_price_desc)
Python条件で抽出・変換する(辞書内包表記)
items() と辞書内包表記を組み合わせると、“条件でフィルタしつつ値を変換”を一行で書けます。
product = {"coffee": 350, "tea": 280, "juice": 220}
expensive = {name: price for name, price in product.items() if price >= 300}
with_tax = {name: round(price * 1.1) for name, price in product.items()}
print(expensive) # {'coffee': 350}
print(with_tax) # {'coffee': 385, 'tea': 308, 'juice': 242}
Pythonキー・値の入れ替え(注意点あり)
値がユニークなときは“反転辞書”を作れます。重複値があるなら、リストや集合で受ける設計にします。
d = {"A": 1, "B": 2, "C": 1}
inv = {}
for k, v in d.items():
inv.setdefault(v, []).append(k) # 値ごとにキーを集約
print(inv) # {1: ['A', 'C'], 2: ['B']}
Python更新と走査のルール(重要ポイントを深掘り)
走査しながら辞書を“直接”変更しない
items() で回している最中に、同じ辞書へ追加・削除すると順序や反復が乱れます。安全策は「新しい辞書へ書き出す」か、「固定スナップショット(list(d.items()))を回す」ことです。
d = {"a": 1, "b": 2, "c": 3}
for k, v in list(d.items()): # スナップショットを回す
if v % 2 == 1:
del d[k]
print(d) # {'b': 2}
Python速度とメモリ(ビューの利点)
items() はビューなので、大きな辞書でも余分なコピーを作りません。並べ替えやリスト化を行う場合のみ、その時点でメモリを消費します。まずはビューでループし、必要な場面だけ list(…) や sorted(…) を適用するのが効率的です。
例題で身につける(定番から一歩先まで)
例題1:キーと値を同時に使って整形出力
user = {"name": "Hanako", "age": 20, "city": "Tokyo"}
for k, v in user.items():
print(f"{k:<5} : {v}")
Python例題2:合計・平均などの集計
scores = {"math": 80, "eng": 70, "sci": 90}
total = sum(v for _, v in scores.items())
avg = total / len(scores)
print(total, avg) # 240 80.0
Python例題3:値で並べ替えてランキング表示
sales = {"coffee": 5, "tea": 1, "juice": 3}
for name, qty in sorted(sales.items(), key=lambda kv: kv[1], reverse=True):
print(name, qty)
# coffee 5 / juice 3 / tea 1
Python例題4:ネスト辞書の走査(階層ごと)
store = {
"coffee": {"price": 350, "qty": 2},
"tea": {"price": 280, "qty": 1},
}
for name, info in store.items():
print(name, info["price"] * info["qty"])
Python落とし穴とベストプラクティス
items() と keys()/values() の選択
キーだけ・値だけが必要なら keys()/values() のほうが意図が明確です。両方を使うなら items() を選びます。
大量データでの並べ替えコスト
sorted(d.items()) はペアのリストを作ってから並べ替えます。必要な場面だけ使い、普段はビューのままループしてコストを抑えましょう。
反復中の更新禁止の原則
反復中に同じ辞書を直接更新しない。どうしても必要ならスナップショットで回すか、結果を書き込む“別辞書”を用意します。
まとめ
dict.items は「キーと値を同時に扱うためのビュー」で、コピーせず効率よく反復でき、辞書の変更を即時に反映します。for ループでのアンパック、辞書内包表記と組み合わせたフィルタ・変換、sorted での値基準の並べ替えなどが定番です。走査中に辞書を直接更新しないこと、必要な場面だけリスト化・並べ替えを行うことを守れば、初心者でも読みやすく性能を意識した辞書処理を書けます。
