辞書のキーや値を一度に見渡せると、データの確認や集計、条件抽出がとても楽になります。
本記事では、keys()、values()、items()の基本から、ループや内包表記での使いこなしまで、初心者の方にもわかるよう段階を追って丁寧に解説します。
辞書ビューの性質(動的に変化を反映)や順序の扱いなどの注意点も最後にまとめます。
辞書のキーと値を一覧取得する基本
辞書から一覧を取り出す基本のメソッドはkeys()、values()、items()の3つです。
これらは辞書ビューと呼ばれる専用オブジェクトを返し、必要に応じてlist()でリストに変換できます。
下表は用途の対応関係を簡潔にまとめたものです。
| メソッド/式 | 返すもの | 主な用途 | 戻り値の型 |
|---|---|---|---|
d.keys() | キーの一覧 | キーだけを確認・ループ | dict_keys |
d.values() | 値の一覧 | 値の確認・集計 | dict_values |
d.items() | (キー, 値)のタプル一覧 | キーと値を同時処理 | dict_items |
list(d.keys()) | キーのリスト | インデックスアクセス・ソート | list |
keys()でキー一覧を取得
keys()は辞書のすべてのキーを表すビューを返します。
ループにそのまま使えます。
# 辞書の例
user = {"id": 100, "name": "Alice", "active": True}
# キー一覧を取得
ks = user.keys()
print(ks) # ビューの見た目
print(type(ks)) # 型情報
print(list(ks)) # 必要ならリスト化
dict_keys(['id', 'name', 'active'])
<class 'dict_keys'>
['id', 'name', 'active']
values()で値一覧を取得
values()はすべての値を表すビューを返します。
平均や合計などの集計にも使えます。
scores = {"math": 80, "english": 75, "science": 92}
vs = scores.values()
print(vs)
print(sum(vs) / len(vs)) # 平均値を計算
dict_values([80, 75, 92])
82.33333333333333
- dict.values – 組み込み型 — Python 3.13.7 ドキュメント
- sum – 組み込み関数 — Python 3.13.7 ドキュメント
- 関連記事:整数(int)と小数(float)の計算方法をやさしく解説
items()でキーと値のペア一覧を取得
items()は各要素を(キー, 値)のタプルとして返します。
キーと値を同時に扱いたいときの基本形です。
user = {"id": 100, "name": "Alice", "active": True}
for key, value in user.items(): # タプルのアンパック
print(f"{key} -> {value}")
id -> 100
name -> Alice
active -> True
list()でリスト化する
ビューはリストと似ていますが、インデックスアクセスやソートなどが必要なときはlist()で明示的にリストへ変換します。
変換は必要最小限にとどめるのがベストプラクティスです。
d = {"b": 2, "a": 1, "c": 3}
key_list = list(d.keys())
val_list = list(d.values())
item_list = list(d.items())
print(key_list)
print(sorted(key_list)) # リストなのでソートできる
print(item_list)
['b', 'a', 'c']
['a', 'b', 'c']
[('b', 2), ('a', 1), ('c', 3)]
- list() – 組み込み関数 — Python 3.13.7 ドキュメント
- sorted() – 組み込み関数 — Python 3.13.7 ドキュメント
- 関連記事:もう迷わない!リストを昇順・降順にソートする
戻り値の型(dict_keys等)と特徴
keys()などの戻り値は辞書ビュー(dict_keys、dict_values、dict_items)です。
ビューは次の特徴を持ちます。
- 参照元の辞書が変化すると内容が自動的に更新されます。
inでの存在確認やループにそのまま使えます。- 必要に応じて
list()やset()に変換できます。
d = {"x": 1, "y": 2}
ks = d.keys()
print(ks) # 変更前
d["z"] = 3 # 辞書を変更
print(ks) # ビューは変更を反映
dict_keys(['x', 'y'])
dict_keys(['x', 'y', 'z'])
ループで一覧を扱う
辞書の一覧を扱う基本はforループです。
キーだけ、あるいはキーと値を同時に取り出す書き方を押さえましょう。
forでキーだけを回す
辞書をそのままループするとキーが走査されます。
キーから値を取りたいときはd[key]で参照します。
user = {"id": 100, "name": "Alice", "active": True}
# 辞書をそのまま回すとキーになる
for k in user:
print(k, "=>", user[k]) # キーから値を参照
id => 100
name => Alice
active => True
forでキーと値を同時に回す(items)
キーも値も同時に使うならitems()が読みやすく高速です。
scores = {"math": 80, "english": 75, "science": 92}
for subject, score in scores.items():
print(f"{subject}: {score}")
math: 80
english: 75
science: 92
enumerateと組み合わせる
行番号を付けたいときはenumerate()が便利です。
start=1で1始まりにできます。
features = {"login": True, "payment": False, "search": True}
for i, (name, enabled) in enumerate(features.items(), start=1):
print(f"{i}. {name} -> {enabled}")
1. login -> True
2. payment -> False
3. search -> True
条件で一覧を作る
フィルタ条件を付けて、必要なキーや値だけを取り出す方法です。
内包表記を使うと簡潔に書けます。
値でフィルタしてキー一覧を作る
たとえば価格が一定以上の商品名だけを集めたいときは、items()と条件式を組み合わせます。
prices = {"apple": 120, "banana": 80, "cherry": 250, "avocado": 250}
# 200円以上の商品名(キー)だけを抽出
expensive_items = [name for name, price in prices.items() if price >= 200]
print(expensive_items)
['cherry', 'avocado']
キーでフィルタして値一覧を作る
キーのパターン(接頭辞など)で値側を集めたい場合です。
prices = {"apple": 120, "banana": 80, "cherry": 250, "avocado": 250}
# 'a'で始まる果物の価格(値)だけを抽出
a_values = [price for name, price in prices.items() if name.startswith("a")]
print(a_values)
[120, 250]
内包表記で簡潔に書く
内包表記は読みやすさと速度の両立に向いています。
キーだけ、値だけ、ペアの加工などを1行で表現できます。
d = {"b": 2, "a": 1, "c": 3}
# キーを大文字化して一覧に
upper_keys = [k.upper() for k in d]
# 値を2倍にして一覧に
doubled_values = [v * 2 for v in d.values()]
# "a"を含むキーの(キー, 値)ペアだけを抽出
filtered_items = [(k, v) for k, v in d.items() if "a" in k]
print(upper_keys)
print(doubled_values)
print(filtered_items)
['B', 'A', 'C']
[4, 2, 6]
[('a', 1)]
注意点とベストプラクティス
一覧取得は簡単ですが、辞書ビューの挙動や順序を理解しておくと意図しないバグを防げます。
ビューは辞書の変更を反映する
ビューはリアルタイムに内容が変わります。
スナップショットが必要ならlist()に変換して保持します。
d = {"x": 1, "y": 2}
ks = d.keys() # ビューを取得
d["z"] = 3 # 追加
print(list(ks)) # すでに'z'が見える
d.pop("y") # 削除
print(list(ks)) # 'y'が消えている
['x', 'y', 'z']
['x', 'z']
ポイント: 反映されるのが望ましくない場面(並列処理やログ出力など)では、list(d.keys())のようにコピーを取ります。
順序は挿入順(Python 3.7+)
Python 3.7以降、辞書は挿入順を保持します。
つまりkeys()やitems()の順序も基本的に挿入順です。
d = {}
d["b"] = 2
d["a"] = 1
d["c"] = 3
print(list(d.keys())) # 挿入した順に並ぶ
d.pop("a")
d["a"] = 10 # 再挿入は末尾になる
print(list(d.keys()))
['b', 'a', 'c']
['b', 'c', 'a']
補足: 並べ替えたい場合はsorted(d.keys())やsorted(d.items())を使います。
キーは一意、値は重複可
辞書ではキーは一意で、後から同じキーに代入すると上書きされます。
値は重複しても構いません。
d = {"apple": 100, "banana": 100, "apple": 120} # 'apple'は上書きされる
print(d)
# 値の重複があるとき、ユニークな値だけ欲しい場合
unique_values = set(d.values()) # 集合にして重複を除去
print(unique_values)
{'apple': 120, 'banana': 100}
{120, 100}
実務のコツ: キーの衝突を避けたいときは、複合キー(タプル)や名前空間となる接頭辞を設計します。
重複値の扱いは要件(最頻値の算出、ユニーク化など)に合わせてsetやcollections.Counterを活用します。
- マッピング型 — dict — Python 3.13.7 ドキュメント
- set – 組み込み型 — Python 3.13.7 ドキュメント
- 関連記事:setでリストの重複を一瞬で削除する方法と注意点
- 関連記事:リストの要素ごとの数を速く数えるcollections.Counterの使い方
まとめ
辞書の一覧取得はkeys()、values()、items()の3本柱を押さえれば十分に使いこなせます。
ビューは動的に辞書の変更を反映するため、そのままループする、必要に応じてlist化する、という使い分けが肝心です。
順序はPython 3.7以降で挿入順、キーは一意で値は重複可という基本性質を理解しておけば、条件抽出や集計、整形出力までスムーズに対応できます。
まずは小さな辞書で動作を確かめ、徐々に内包表記やenumerateとの組み合わせに慣れていきましょう。
