辞書からキーや値を一覧で取り出す処理は、データの確認や出力整形、集計を行う際に頻出です。
本記事では、Pythonのdict.keys()
、dict.values()
、dict.items()
を中心に、一覧の取得方法からループでの使い方、動作の注意点までを初心者向けに順を追って解説します。
Pythonの辞書からキーと値を一覧で取得
ここではまず、辞書からキーだけ、値だけ、そしてキーと値のペアをまとめて取り出す3つの基本メソッドを確認します。
例として、果物と価格の辞書を用意します。
# サンプル辞書(果物の価格)。値(価格)は重複しうることに注意。
prices = {
"apple": 120,
"banana": 200,
"orange": 150,
"mango": 200, # 200が重複
}
print(prices)
{'apple': 120, 'banana': 200, 'orange': 150, 'mango': 200}
dict.keys()でキー一覧を取得
dict.keys()
は、辞書に存在する全てのキーを「ビュー」として返します。
ビューは見た目はコレクションのように扱えますが、リストではありません(後述)。
prices = {
"apple": 120,
"banana": 200,
"orange": 150,
"mango": 200, # 200が重複
}
# キーの一覧を取得
keys_view = prices.keys()
print(keys_view) # ビューの表示
print("banana" in keys_view) # 'in' による存在確認
dict_keys(['apple', 'banana', 'orange', 'mango'])
True
ポイントとして、in
で存在確認ができるため、キーの有無チェックにも使えます。
dict.values()で値一覧を取得
dict.values()
は、辞書に保存されている全ての値を返します。
値は重複しても問題ありません。
prices = {
"apple": 120,
"banana": 200,
"orange": 150,
"mango": 200, # 200が重複
}
# 値の一覧を取得
values_view = prices.values()
print(values_view)
dict_values([120, 200, 150, 200])
値は重複しうるため、後で重複を除きたい場合はset
などを使います(後述)。
dict.items()でキーと値のペア一覧を取得
dict.items()
は、各要素を(キー, 値)
のタプルにしたビューを返します。
ループでキーと値を同時に取り出すのに最適です。
prices = {
"apple": 120,
"banana": 200,
"orange": 150,
"mango": 200, # 200が重複
}
# (キー, 値)のペアを取得
items_view = prices.items()
print(items_view)
# 1件ずつ確認したいとき
for k, v in prices.items():
print(f"{k} -> {v}")
dict_items([('apple', 120), ('banana', 200), ('orange', 150), ('mango', 200)])
apple -> 120
banana -> 200
orange -> 150
mango -> 200
以下の表は、3つのメソッドの違いを簡潔に整理したものです。
メソッド | 返り値の型(ビュー) | 内容 | 主な用途 | 辞書変更の反映 |
---|---|---|---|---|
dict.keys() | dict_keys | キーのみ | 存在確認、キーの列挙 | される |
dict.values() | dict_values | 値のみ | 値の列挙、集計 | される |
dict.items() | dict_items | (キー, 値)のペア | 同時取り出し | される |
リスト化とループでの使い方
ビューはイテラブルですがリストではないため、必要に応じてリスト化して扱うことがあります。
また、ループでの使い方は覚えてしまうと実務で非常に役立ちます。
listでdict_keysやdict_valuesをリストに変換
一覧を固定したスナップショットとして扱いたい場合や、インデックスでアクセスしたい場合はlist()
で変換します。
prices = {
"apple": 120,
"banana": 200,
"orange": 150,
"mango": 200, # 200が重複
}
# ビューをリストに変換して固定する(スナップショット)
keys_list = list(prices.keys())
values_list = list(prices.values())
items_list = list(prices.items())
print(keys_list)
print(values_list)
print(items_list)
print(keys_list[1], items_list[2]) # インデックスアクセスの例
['apple', 'banana', 'orange', 'mango']
[120, 200, 150, 200]
[('apple', 120), ('banana', 200), ('orange', 150), ('mango', 200)]
banana ('orange', 150)
forループでキーや値を順に処理
辞書はそのままループするとキーが順に取り出されます。
dict.keys()
を明示しても同じ結果です。
prices = {
"apple": 120,
"banana": 200,
"orange": 150,
"mango": 200, # 200が重複
}
# キーだけループ(書き方は2通り。結果は同じ)
for k in prices: # 省略形
print(k)
for k in prices.keys(): # 明示形
print(k)
# 値だけループ
total = 0
for v in prices.values():
total += v
print("合計:", total)
apple
banana
orange
mango
apple
banana
orange
mango
合計: 670
キーと値を同時に取り出すforの書き方
dict.items()
を使うと、アンパックでキーと値を同時に受け取れます。
整形出力や条件分岐がしやすくなります。
prices = {
"apple": 120,
"banana": 200,
"orange": 150,
"mango": 200, # 200が重複
}
# (キー, 値)を同時に取り出す
for fruit, price in prices.items():
if price >= 180:
print(f"{fruit} は少し高め({price}円)")
else:
print(f"{fruit} はお手頃({price}円)")
apple はお手頃(120円)
banana は少し高め(200円)
orange はお手頃(150円)
mango は少し高め(200円)
知っておきたい挙動と注意点
細かな仕様を理解しておくと、思わぬバグを避けられます。
特に順序とビューの動的更新、重複値の扱いは重要です。
挿入順で一覧が並ぶ(Python 3.7+)
Python 3.7以降の辞書は、基本的に「挿入した順序」を保持します。
再代入しても順序は変わりません。
d = {}
d["b"] = 2
d["a"] = 1
d["c"] = 3
print(list(d.keys())) # 追加した順
# 既存キーに再代入しても順序は維持される
d["a"] = 10
print(list(d.keys()))
['b', 'a', 'c']
['b', 'a', 'c']
ビューは動的に変わるため必要ならlistで固定
keys()
やvalues()
、items()
が返すビューは「辞書の現在の状態を映す窓」です。
辞書を変更するとビューの内容も変わります。
スナップショットが必要ならlist()
に変換します。
d = {"x": 1, "y": 2}
ks = d.keys() # 動的ビュー
ks_snapshot = list(d.keys()) # 固定スナップショット
print("初期:", ks)
print("初期(固定):", ks_snapshot)
# 辞書を更新
d["z"] = 3
print("更新後ビュー:", ks) # 変化が反映される
print("更新後(固定):", ks_snapshot) # 変わらない
初期: dict_keys(['x', 'y'])
初期(固定): ['x', 'y']
更新後ビュー: dict_keys(['x', 'y', 'z'])
更新後(固定): ['x', 'y']
値の重複を除くならsetで一意化
values()
は重複を含むため、一意な値だけにしたいときはset
で変換します。
ただしset
は順序を持たないことに注意してください。
vals = prices.values()
unique_vals = set(vals) # 重複を除去(順序なし)
print(unique_vals)
{200, 120, 150}
もし「最初に現れた順序で一意化」したい場合は、dict.fromkeys
を使うと簡単です(Python 3.7+では挿入順を保持します)。
# 値の出現順を保った一意化
ordered_unique_vals = list(dict.fromkeys(prices.values()))
print(ordered_unique_vals)
[120, 200, 150]
この方法は、重複を除去しつつ見た目の順序を維持したい場合に便利です。
まとめ
キー一覧はdict.keys()
、値一覧はdict.values()
、キーと値のペア一覧はdict.items()
で取得できます。これらはすべて「ビュー」であり、辞書の変更がリアルタイムに反映されます。
インデックスでのアクセスや状態の固定が必要なときは、list()
でスナップショットを作成します。
Python 3.7以降、辞書は挿入順を保持します。整形出力やループの見通しが良くなります。
値の重複を除去するにはset
を使います。順序を保って一意化したい場合はdict.fromkeys
が有効です。
実務では、キー存在チェック(例:"banana" in prices
)やfor k, v in dict.items():
の同時取り出しを自然に使えるようにしておくと、データ操作が格段に楽になります。