MeWrite Docs

Iterating over dictionaries using 'for' loops

Pythonで辞書をforループでイテレートする方法

概要

Pythonの辞書(dict)をforループでイテレートする際の基本的な方法と注意点です。Stack Overflowで非常に多く閲覧されている質問の1つです。

基本的なイテレーション

キーのみをイテレート

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
d = {'a': 1, 'b': 2, 'c': 3}

# 方法1: 直接ループ(デフォルトはキー)
for key in d:
    print(key)
# 出力: a, b, c

# 方法2: keys()を使用(明示的)
for key in d.keys():
    print(key)

値のみをイテレート

1
2
3
4
5
d = {'a': 1, 'b': 2, 'c': 3}

for value in d.values():
    print(value)
# 出力: 1, 2, 3

キーと値を同時にイテレート

1
2
3
4
5
6
7
8
9
d = {'a': 1, 'b': 2, 'c': 3}

# items()を使用(推奨)
for key, value in d.items():
    print(f"{key}: {value}")
# 出力:
# a: 1
# b: 2
# c: 3

よくある間違い

キーでループして値にアクセス(非効率)

1
2
3
4
5
6
7
8
9
d = {'a': 1, 'b': 2, 'c': 3}

# NG: 毎回辞書へのアクセスが発生
for key in d:
    print(d[key])

# OK: items()で一度に取得
for key, value in d.items():
    print(value)

ループ中に辞書を変更

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
d = {'a': 1, 'b': 2, 'c': 3}

# NG: RuntimeError: dictionary changed size during iteration
for key in d:
    if d[key] == 2:
        del d[key]

# OK: list()でコピーを作成
for key in list(d.keys()):
    if d[key] == 2:
        del d[key]

# OK: 辞書内包表記で新しい辞書を作成
d = {k: v for k, v in d.items() if v != 2}

便利なパターン

インデックス付きイテレーション

1
2
3
4
5
6
7
8
d = {'a': 1, 'b': 2, 'c': 3}

for i, (key, value) in enumerate(d.items()):
    print(f"{i}: {key} = {value}")
# 出力:
# 0: a = 1
# 1: b = 2
# 2: c = 3

条件付きフィルタリング

1
2
3
4
5
6
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

# 値が2以上の要素のみ
for key, value in d.items():
    if value >= 2:
        print(f"{key}: {value}")

ソートしてイテレート

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
d = {'c': 3, 'a': 1, 'b': 2}

# キーでソート
for key in sorted(d.keys()):
    print(f"{key}: {d[key]}")
# 出力: a: 1, b: 2, c: 3

# 値でソート
for key, value in sorted(d.items(), key=lambda x: x[1]):
    print(f"{key}: {value}")
# 出力: a: 1, b: 2, c: 3

ネストした辞書

1
2
3
4
5
6
7
8
nested = {
    'user1': {'name': 'Alice', 'age': 30},
    'user2': {'name': 'Bob', 'age': 25}
}

for user_id, user_data in nested.items():
    for key, value in user_data.items():
        print(f"{user_id}.{key}: {value}")

Python 3.7以降の順序保証

1
2
3
4
5
6
7
8
9
# Python 3.7以降、辞書は挿入順序を保持
d = {}
d['first'] = 1
d['second'] = 2
d['third'] = 3

for key in d:
    print(key)
# 出力: first, second, third(挿入順)

パフォーマンス

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import timeit

d = {i: i**2 for i in range(10000)}

# 遅い: キーでループして値にアクセス
def slow():
    for key in d:
        _ = d[key]

# 速い: items()を使用
def fast():
    for key, value in d.items():
        _ = value

# items()の方が約20%速い

辞書内包表記

1
2
3
4
5
6
7
8
9
d = {'a': 1, 'b': 2, 'c': 3}

# 値を2倍にした新しい辞書
doubled = {k: v * 2 for k, v in d.items()}
# {'a': 2, 'b': 4, 'c': 6}

# 条件付き
filtered = {k: v for k, v in d.items() if v > 1}
# {'b': 2, 'c': 3}

関連エラー

関連エラー

Python の他のエラー

最終更新: 2025-12-24