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
Pythonvalues() を単独でソートすると、どの値がどのキーだったかの対応が切れる点に注意してください。
値でフィルタして新しい辞書を作る
辞書内包表記と組み合わせると、値の条件で抽出・変換が一行で書けます。
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) である点、反復中の更新禁止、ミュータブル値の変更がそのまま辞書へ反映される点を理解しておけば、初心者でも安全で読みやすい値中心の処理を書けます。
