Python | データ構造:dict.values

Python
スポンサーリンク

dict.values の概要(値だけを“コピーせず”参照するビュー)

dict.values は、辞書に入っている「値」の一覧を参照できるメソッドです。戻り値は dict_values という“ビューオブジェクト”で、辞書の内容をコピーせずに映し出します。大きな辞書でも軽く扱え、for ループで値だけを処理したいときに最適です。

scores = {"math": 80, "eng": 70, "sci": 90}
print(scores.values())            # dict_values([80, 70, 90])
for v in scores.values():
    print(v)                      # 80 / 70 / 90
Python

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

変更が即時に反映され、コピーしない

dict.values() は辞書の現在の値を映すビューです。辞書を更新するとビューにも即時に反映されます。固定したスナップショットが必要なときだけ list(…) でリスト化します。

d = {"a": 1}
view = d.values()
print(list(view))  # [1]

d["b"] = 2         # 辞書を更新
print(list(view))  # [1, 2]  ← 変更が反映
Python

順序は「挿入順」に対応する

Python 3.7 以降、辞書は挿入順を保持します。values() の並びもキーの挿入順に対応します。並べ替えたい場合は、sorted(d.values()) で値の昇順などにできます(ただし、元の辞書との対応関係は失われるため、キーも必要なら items() を使います)。

prices = {"coffee": 350, "tea": 280, "juice": 220}
print(list(prices.values()))       # [350, 280, 220](挿入順)
print(sorted(prices.values()))     # [220, 280, 350](値の昇順)
Python

取り出し・集計・判定の基本(頻出の使い方)

合計・最大・最小・平均などの集計

値だけが欲しい集計は values() から直接行うと簡潔です。

scores = {"math": 80, "eng": 70, "sci": 90}
total = sum(scores.values())
avg   = total / len(scores)
print(total, avg)  # 240 80.0

mx = max(scores.values())
mn = min(scores.values())
print(mx, mn)      # 90 70
Python

すべて/いずれかの条件を満たすかの判定

any と all を使うと読みやすく書けます。

conf = {"A": True, "B": True, "C": False}
print(all(conf.values()))  # 全て True か → False
print(any(conf.values()))  # いずれか True か → True
Python

値の存在確認は“線形探索”になる

“in 値 in dict.values()” は辞書の全値をなめるため O(n) です。キーの存在確認(”key” in dict)はハッシュで O(1) と高速、役割が違う点を覚えておきましょう。

d = {"x": 10, "y": 20}
print(10 in d.values())   # True(O(n))
print("x" in d)           # True(O(1))
Python

値に基づく並べ替えやフィルタ(重要ポイントを深掘り)

値で並べ替えたいときは items() を使う

「値の大小でキーごと並べ替えたい」なら items() を並べ替え、キーと値を同時に扱います。

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

values() を単独でソートすると、どの値がどのキーだったかの対応が切れる点に注意してください。

値でフィルタして新しい辞書を作る

辞書内包表記と組み合わせると、値の条件で抽出・変換が一行で書けます。

product = {"coffee": 350, "tea": 280, "juice": 220}
expensive = {k: v for k, v in product.items() if v >= 300}
with_tax   = {k: round(v * 1.1) for k, v in product.items()}
print(expensive)  # {'coffee': 350}
print(with_tax)   # {'coffee': 385, 'tea': 308, 'juice': 242}
Python

ユニーク値の抽出や頻度分析(応用まで押さえる)

重複を除いた値集合を得る

values() は重複を含みます。重複を除きたいなら set(…) に通します。

users = {"u1": "Tokyo", "u2": "Osaka", "u3": "Tokyo"}
cities = set(users.values())
print(cities)  # {'Tokyo', 'Osaka'}
Python

値の頻度を数える(Counter)

collections.Counter と組み合わせると、値の出現回数が簡単に集計できます。

from collections import Counter

users = {"u1": "Tokyo", "u2": "Osaka", "u3": "Tokyo", "u4": "Nagoya"}
print(Counter(users.values()))  # Counter({'Tokyo': 2, 'Osaka': 1, 'Nagoya': 1})
Python

落とし穴とベストプラクティス(安全に使いこなす)

反復中に同じ辞書を更新しない

values() で回している最中に、同じ辞書へ追加・削除すると反復が乱れます。どうしても更新したいときは 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

値がミュータブルな場合の注意

values() が返すのは“参照”です。値にリストや辞書などのミュータブルが入っていると、中身を変更すれば辞書の値も変わります。設計上問題ないか意識しましょう。

store = {"coffee": {"price": 350}, "tea": {"price": 280}}
for info in store.values():
    info["price"] += 20
print(store)  # 価格が更新されている
Python

インデックスアクセスはできない

dict_values はリストではないため、インデックス指定はできません。位置が必要なら list(d.values()) に変換してから扱います。ただし「位置とキーの対応」は失われるため、キーも必要なら items() を使います。

vals = {"a": 10, "b": 20}.values()
# vals[0]  # エラー
vals_list = list(vals)
print(vals_list[0])
Python

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

例題1:値だけを整形して出力

product = {"coffee": 350, "tea": 280, "juice": 220}
for price in product.values():
    print(f{price}")
Python

例題2:値の合計と平均を出す

scores = {"math": 80, "eng": 70, "sci": 90}
total = sum(scores.values())
avg   = total / len(scores)
print(total, avg)  # 240 80.0
Python

例題3:値のユニーク集合と頻度

users = {"u1": "Tokyo", "u2": "Osaka", "u3": "Tokyo", "u4": "Nagoya"}
print(set(users.values()))            # {'Tokyo', 'Osaka', 'Nagoya'}

from collections import Counter
print(Counter(users.values()))        # Counter({'Tokyo': 2, 'Osaka': 1, 'Nagoya': 1})
Python

例題4:値でフィルタして新辞書を生成

prices = {"coffee": 350, "tea": 280, "juice": 220}
over300 = {k: v for k, v in prices.items() if v >= 300}
print(over300)  # {'coffee': 350}
Python

まとめ

dict.values は「辞書の値一覧をコピーせず参照するビュー」で、軽量に反復・集計・判定ができます。並べ替えやスナップショットが必要な場面だけ list(…) や sorted(…) を適用し、キーとの対応が必要なら items() を使うこと。値存在チェックは O(n) である点、反復中の更新禁止、ミュータブル値の変更がそのまま辞書へ反映される点を理解しておけば、初心者でも安全で読みやすい値中心の処理を書けます。

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