閉じる

【Python】辞書のキーと値を一覧で取得する方法(keys,values)

辞書のキーや値を一度に見渡せると、データの確認や集計、条件抽出がとても楽になります。

本記事では、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()は辞書のすべてのキーを表すビューを返します。

ループにそのまま使えます。

Python
# 辞書の例
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()はすべての値を表すビューを返します。

平均や合計などの集計にも使えます。

Python
scores = {"math": 80, "english": 75, "science": 92}

vs = scores.values()
print(vs)
print(sum(vs) / len(vs))  # 平均値を計算
実行結果
dict_values([80, 75, 92])
82.33333333333333

items()でキーと値のペア一覧を取得

items()は各要素を(キー, 値)のタプルとして返します。

キーと値を同時に扱いたいときの基本形です。

Python
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()で明示的にリストへ変換します。

変換は必要最小限にとどめるのがベストプラクティスです。

Python
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)]

戻り値の型(dict_keys等)と特徴

keys()などの戻り値は辞書ビュー(dict_keysdict_valuesdict_items)です。

ビューは次の特徴を持ちます。

  1. 参照元の辞書が変化すると内容が自動的に更新されます。
  2. inでの存在確認やループにそのまま使えます。
  3. 必要に応じてlist()set()に変換できます。
Python
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]で参照します。

Python
user = {"id": 100, "name": "Alice", "active": True}

# 辞書をそのまま回すとキーになる
for k in user:
    print(k, "=>", user[k])  # キーから値を参照
実行結果
id => 100
name => Alice
active => True

forでキーと値を同時に回す(items)

キーも値も同時に使うならitems()が読みやすく高速です。

Python
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始まりにできます。

Python
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()と条件式を組み合わせます。

Python
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']

キーでフィルタして値一覧を作る

キーのパターン(接頭辞など)で値側を集めたい場合です。

Python
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行で表現できます。

Python
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()に変換して保持します。

Python
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()の順序も基本的に挿入順です。

Python
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())を使います。

キーは一意、値は重複可

辞書ではキーは一意で、後から同じキーに代入すると上書きされます。

値は重複しても構いません。

Python
d = {"apple": 100, "banana": 100, "apple": 120}  # 'apple'は上書きされる
print(d)

# 値の重複があるとき、ユニークな値だけ欲しい場合
unique_values = set(d.values())  # 集合にして重複を除去
print(unique_values)
実行結果
{'apple': 120, 'banana': 100}
{120, 100}

実務のコツ: キーの衝突を避けたいときは、複合キー(タプル)や名前空間となる接頭辞を設計します。

重複値の扱いは要件(最頻値の算出、ユニーク化など)に合わせてsetcollections.Counterを活用します。

まとめ

辞書の一覧取得はkeys()values()items()の3本柱を押さえれば十分に使いこなせます。

ビューは動的に辞書の変更を反映するため、そのままループする、必要に応じてlist化する、という使い分けが肝心です。

順序はPython 3.7以降で挿入順、キーは一意で値は重複可という基本性質を理解しておけば、条件抽出や集計、整形出力までスムーズに対応できます。

まずは小さな辞書で動作を確かめ、徐々に内包表記やenumerateとの組み合わせに慣れていきましょう。

この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!