Python | データ構造:dict.items

Python
スポンサーリンク

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 での値基準の並べ替えなどが定番です。走査中に辞書を直接更新しないこと、必要な場面だけリスト化・並べ替えを行うことを守れば、初心者でも読みやすく性能を意識した辞書処理を書けます。

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