言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Python辞典

  1. トップページ
  2. Python辞典
  3. 辞書.keys() / 辞書.values() / 辞書.items()

辞書.keys() / 辞書.values() / 辞書.items()

対応: Python 2(2000)

辞書のキー・値・キーと値のペアをビューオブジェクトとして取得するメソッドです。for文での反復処理や集合演算に使われます。

構文

# 辞書のすべてのキーのビューを返す
辞書.keys()

# 辞書のすべての値のビューを返す
辞書.values()

# 辞書のすべてのキーと値のペア(タプル)のビューを返す
辞書.items()

関数一覧

メソッド概要
dict.keys()辞書のすべてのキーを表示するビューオブジェクト(dict_keys)を返します。辞書が更新されると自動的に反映されます。
dict.values()辞書のすべての値を表示するビューオブジェクト(dict_values)を返します。重複する値も含めてすべて返します。
dict.items()辞書のすべての(キー, 値)タプルのビューオブジェクト(dict_items)を返します。

サンプルコード

dict_keys_values_items.py
person = {
    "name": "user1",
    "age": 28,
    "org": "dev_team",
    "email": "user1@wp-p.info"
}

# keys() でキーを反復
print(list(person.keys())) # ['name', 'age', 'org', 'email']
for key in person.keys():
    print(key, end=" ") # name age org email
# ※ for key in person: と書いても同じ結果になる

# values() で値を反復
print(list(person.values())) # ['user1', 28, 'dev_team', 'user1@wp-p.info']
for value in person.values():
    print(value, end=" ") # user1 28 dev_team user1@wp-p.info

# items() でキーと値のペアを反復(よく使われるパターン)
for key, value in person.items():
    print(f"{key}: {value}")
# name: user1
# age: 28
# org: dev_team
# email: user1@wp-p.info

# values() でスコアの合計と平均を計算
scores = {"数学": 85, "英語": 92, "国語": 78, "理科": 88}
total = sum(scores.values())
average = total / len(scores)
print(f"合計: {total}, 平均: {average:.1f}") # 合計: 343, 平均: 85.8

# keys() を使った集合演算(セット演算)
dict1 = {"a": 1, "b": 2, "c": 3}
dict2 = {"b": 20, "c": 30, "d": 40}

# 両方の辞書に共通するキーを取得
common_keys = dict1.keys() & dict2.keys()
print(common_keys) # {'b', 'c'}

# dict1 にあって dict2 にないキーを取得
only_in_dict1 = dict1.keys() - dict2.keys()
print(only_in_dict1) # {'a'}

# items() で辞書を変換する実用例
# キーと値を入れ替える
original = {"a": 1, "b": 2, "c": 3}
inverted = {v: k for k, v in original.items()}
print(inverted) # {1: 'a', 2: 'b', 3: 'c'}

# 特定の条件を満たすキーだけを持つ辞書を作る
filtered = {k: v for k, v in scores.items() if v >= 85}
print(filtered) # {'数学': 85, '英語': 92, '理科': 88}

# ビューオブジェクトは辞書の変更を動的に反映する
d = {"x": 1}
keys_view = d.keys()
print(list(keys_view)) # ['x']
d["y"] = 2
print(list(keys_view)) # ['x', 'y'](辞書の変更が反映されます)

実行すると次のように出力されます。

python3 dict_keys_values_items.py
['name', 'age', 'org', 'email']
name age org email ['user1', 28, 'dev_team', 'user1@wp-p.info']
user1 28 dev_team user1@wp-p.info name: user1
age: 28
org: dev_team
email: user1@wp-p.info
合計: 343, 平均: 85.8
{'b', 'c'}
{'a'}
{1: 'a', 2: 'b', 3: 'c'}
{'数学': 85, '英語': 92, '理科': 88}
['x']
['x', 'y']

よくあるミス

よくあるミス1: 反復中に辞書を変更するとエラー

辞書のビューオブジェクト(keys/values/items)を反復中に辞書を変更すると『RuntimeError』が発生します。変更する場合はコピーして反復します。

scores = {'item_a': 10, 'item_b': 8, 'item_c': 7}

# 反復中に辞書を変更するとRuntimeError
try:
    for name in scores.keys():
        if scores[name] < 8:
            del scores[name] # RuntimeError: dictionary changed size during iteration
except RuntimeError as e:
    print(f'エラー: {e}')

次のように記述します。

# リストに変換してから反復する
for name in list(scores.keys()):
    if scores[name] < 8:
        del scores[name]

print(scores) # {'item_a': 10, 'item_b': 8}

よくあるミス2: ビューオブジェクトをリストと混同する

『keys()』『values()』『items()』はビューオブジェクトを返します。リストではないため、インデックスアクセスができません。インデックスアクセスが必要な場合は『list()』で変換します。

scores = {'item_a': 10, 'item_b': 8, 'item_c': 7}

# ビューオブジェクトはインデックスアクセス不可
try:
    first_key = scores.keys()[0] # TypeError
except TypeError:
    print('ビューオブジェクトはインデックスアクセスできません')

次のように記述します。

# list()に変換してからアクセス
keys_list = list(scores.keys())
first_key = keys_list[0]
print(first_key) # 'item_a'

# または next() で最初の要素を取得
first_key = next(iter(scores.keys()))
print(first_key) # 'item_a'

概要

『keys()』『values()』『items()』が返すのはビューオブジェクトです。ビューオブジェクトは辞書の内容を反映する「ウィンドウ」のようなもので、辞書が変更されると自動的に更新されます。リストとして使いたい場合は『list()』で変換します。

辞書をfor文で直接反復(『for key in 辞書:』)すると、『keys()』を使ったときと同じ結果になります。辞書を反復しながら辞書に要素を追加・削除すると『RuntimeError』が発生します。反復中に変更が必要な場合は、先にキーのリスト(『list(辞書.keys())』)を作成してから反復してください。

Python 3.7以降、辞書はキーの挿入順序を保持します。そのため『keys()』の順序は要素を挿入した順になります。辞書の安全なキー取得については『辞書.get() / 辞書.setdefault()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。