Python辞書(dict)への要素追加を完全解説|基本から実務応用まで
CONTENTS
「辞書への追加、どの方法を使えばいいの?」という疑問にお答えします
Pythonを学び始めてしばらく経ったころ、こんな疑問を持ったことはありませんか?
dict[key] = valueとupdate()の使い分けがよくわからない- キーが既に存在するとき、追加と更新はどう違うのか
- 複数の辞書を一気にマージするスマートな書き方が知りたい
- 誤って値を上書きしてしまうバグを防ぎたい
この記事では、Pythonの辞書(dict)への要素追加を中心に、基本的な作成方法から実務で使う応用テクニック、よくある失敗パターンとその回避策まで網羅的に解説します。
初めてPythonの辞書を学ぶ方はもちろん、「なんとなく使えているけれど自信がない」という中級者にも役立つ内容になっています。読み終えるころには、辞書操作を自信を持って選択・実装できるようになるはずです。
Pythonの辞書(dict)とは?基礎をしっかり理解する

1-1. 辞書の特徴とデータ構造
Pythonの辞書(dict)は、キー(key)と値(value)のペアでデータを管理するコレクション型のデータ構造です。
employee = {'name': 'Alice', 'age': 30, 'department': 'Engineering'}
辞書の主な特徴は以下のとおりです。
- キーによる高速アクセス:内部的にハッシュテーブルを使用しており、要素数が増えても検索速度がほぼ一定(O(1))
- 可変(ミュータブル):作成後に要素の追加・更新・削除が可能
- キーの一意性:同じキーを複数持つことはできない(重複すると後の値で上書き)
- 挿入順の保持:Python 3.7以降は辞書への挿入順序が保証される
(公式ドキュメント参照:https://docs.python.org/ja/3/library/stdtypes.html#dict)
1-2. リスト・タプルとの違いを整理する
辞書の立ち位置を明確にするために、他のコレクション型と比較してみましょう。
| 特徴 | リスト(list) | タプル(tuple) | 辞書(dict) |
|---|---|---|---|
| アクセス方法 | インデックス(数値) | インデックス(数値) | キー(任意の型) |
| 可変性 | ○ | ✗(イミュータブル) | ○ |
| 重複要素 | 可 | 可 | キーは不可、値は可 |
| 検索速度 | O(n) | O(n) | O(1) |
| 順序保証 | ○ | ○ | ○(3.7以降) |
リストは順番が重要なデータに向いており、タプルは変更不要な固定データに適しています。一方で辞書は、ラベル付きのデータを高速に検索・管理したい場面で圧倒的な強みを発揮します。
1-3. 辞書が特に役立つ場面
実務でよく使われる辞書のユースケースを押さえておきましょう。
- 設定情報の管理:データベース接続情報やAPIキーなどをキーと値でまとめる
- APIレスポンスの処理:JSONレスポンスはPython上でほぼそのまま辞書として扱える
- カウント・集計処理:単語の出現回数や集計値をキーごとに管理する
- キャッシュ実装:計算結果をキーにひも付けてメモ化する(memoization)
- データのラベル付け:CSVの列名をキーにして各行をレコードとして扱う
辞書の作成方法をおさらい

要素の追加を理解する前提として、辞書を正しく作成できることが重要です。
2-1. 波括弧{}を使ったリテラル記法
最も直感的で読みやすい方法です。
# 基本的な作成
person = {'name': 'Bob', 'age': 25, 'city': 'Tokyo'}
# 空の辞書を作成
empty_dict = {}
# 値にさまざまな型を混在させることも可能
mixed = {'id': 1, 'score': 98.5, 'tags': ['python', 'backend'], 'active': True}
2-2. dict()コンストラクタを使った作成
dict()を使うと、複数の書き方でオブジェクトを生成できます。
# キーワード引数を使う方法
person = dict(name='Carol', age=28)
# タプルのリストから作成
pairs = [('name', 'Dave'), ('age', 32)]
person = dict(pairs)
# zipを使ってキーと値を組み合わせる(実務でよく使う)
keys = ['name', 'age', 'city']
values = ['Eve', 27, 'Osaka']
person = dict(zip(keys, values))
注意:
dict()でキーワード引数を使う場合、キーは有効なPython識別子(変数名として使える文字列)でなければなりません。数字や-(ハイフン)で始まるキーは使えないため、その場合はタプルのリスト形式を選びましょう。
2-3. 辞書内包表記(Dictionary Comprehension)
リスト内包表記と同じ感覚で、条件付きの辞書を簡潔に生成できます。
# 0〜4の数をキー、その2乗を値とする辞書
squares = {x: x**2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 条件付きでフィルタリング
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
# {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
# 文字列を大文字に変換する辞書
words = ['apple', 'banana', 'cherry']
upper_dict = {w: w.upper() for w in words}
辞書に要素を追加する方法【完全解説】
ここからが本題です。Pythonで辞書に要素を追加する方法は複数存在し、それぞれに適した場面があります。
3-1. インデックス演算子[]で1件追加する(最も基本的な方法)
employee = {'name': 'Alice', 'age': 30}
# 新しいキーを指定して値を代入 → 追加
employee['department'] = 'Engineering'
print(employee)
# {'name': 'Alice', 'age': 30, 'department': 'Engineering'}
この方法の特性:
- キーが存在しない場合 → 新規追加
- キーが既に存在する場合 → 値を上書き(更新)
この2つの動作が同じ構文で行われる点が重要です。意図しない上書きを防ぎたい場合は、後述するsetdefault()や事前チェックを組み合わせましょう。
# キーの存在確認を挟んでから追加する安全な書き方
if 'department' not in employee:
employee['department'] = 'Engineering'
3-2. setdefault()メソッドで「存在しないときだけ」追加する
setdefault(key, default)は、キーが存在しない場合にのみ追加を行い、常にそのキーの値を返します。
employee = {'name': 'Alice', 'age': 30}
# キーが存在しない → 追加される
result = employee.setdefault('department', 'General')
print(result) # 'General'
print(employee) # {'name': 'Alice', 'age': 30, 'department': 'General'}
# キーが既に存在する → 上書きされない(既存の値を返す)
result = employee.setdefault('department', 'Engineering')
print(result) # 'General'(既存の値がそのまま返る)
print(employee) # {'name': 'Alice', 'age': 30, 'department': 'General'}(変化なし)
setdefault()が特に役立つ場面:
# リストをネストした辞書の初期化(よくあるパターン)
data = {}
words = ['apple', 'banana', 'apple', 'cherry', 'banana', 'apple']
for word in words:
data.setdefault(word, []).append(1)
print(data)
# {'apple': [1, 1, 1], 'banana': [1, 1], 'cherry': [1]}
if文を使わずにネストされたリストを安全に初期化できるこのパターンは、実務でも頻繁に登場します。
3-3. update()メソッドで複数要素を一括追加・更新する
複数のキーと値をまとめて追加・更新したい場合はupdate()が最適です。
employee = {'name': 'Alice', 'age': 30}
# 辞書を引数として渡す
employee.update({'department': 'Engineering', 'location': 'Tokyo'})
print(employee)
# {'name': 'Alice', 'age': 30, 'department': 'Engineering', 'location': 'Tokyo'}
# キーワード引数として渡すこともできる
employee.update(salary=500000, remote=True)
print(employee)
# {'name': 'Alice', 'age': 30, ..., 'salary': 500000, 'remote': True}
update()の動作:
- 存在しないキー → 追加
- 既存のキー → 値を上書き
update()はAPIレスポンスのデータを既存の辞書にマージしたり、設定辞書を上書き更新したりする場面で特に力を発揮します。
3-4. 辞書のアンパック(**演算子)で新しい辞書を生成する
Python 3.5以降で使える**演算子を使ったアンパックは、元の辞書を変更せずに新しい辞書を作りたいときに使います。
base = {'name': 'Alice', 'age': 30}
extra = {'department': 'Engineering', 'location': 'Tokyo'}
# 2つの辞書をマージして新しい辞書を作成(元の辞書は変化しない)
merged = {**base, **extra}
print(merged)
# {'name': 'Alice', 'age': 30, 'department': 'Engineering', 'location': 'Tokyo'}
# 既存のキーを上書きしながらマージする
overridden = {**base, 'age': 31, **extra}
print(overridden)
# {'name': 'Alice', 'age': 31, 'department': 'Engineering', 'location': 'Tokyo'}
update()との使い分け:
update() |
**アンパック |
|
|---|---|---|
| 元の辞書 | 変更される(破壊的) | 変更されない(非破壊的) |
| 返り値 | None |
新しい辞書 |
| 用途 | インプレースで更新したい | 元データを保持しながら新辞書を作りたい |
3-5. |演算子(Python 3.9以降)でマージする
Python 3.9から導入された|演算子と|=演算子を使うと、より直感的に辞書をマージできます。
# Python 3.9以降
d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
# | 演算子:新しい辞書を返す(非破壊的)
merged = d1 | d2
print(merged) # {'a': 1, 'b': 3, 'c': 4}
# |= 演算子:インプレースで更新(破壊的)
d1 |= d2
print(d1) # {'a': 1, 'b': 3, 'c': 4}
**アンパックよりも可読性が高く、Python 3.9以降の環境であれば積極的に採用を検討してください。
辞書の要素を更新する

4-1. 値を変更する基本操作
既存キーへの再代入が最もシンプルな更新方法です。
employee = {'name': 'Alice', 'age': 30, 'department': 'Engineering'}
# 値を直接更新
employee['age'] = 31
employee['department'] = 'Product'
print(employee)
# {'name': 'Alice', 'age': 31, 'department': 'Product'}
4-2. 数値の加算・演算による更新
カウントや合計値の管理でよく使われるパターンです。
scores = {'Alice': 85, 'Bob': 72}
# スコアに加点する
scores['Alice'] += 10
print(scores) # {'Alice': 95, 'Bob': 72}
# キーが存在しない場合に備えてget()を使う
name = 'Carol'
scores[name] = scores.get(name, 0) + 5
print(scores) # {'Alice': 95, 'Bob': 72, 'Carol': 5}
dict.get(key, default)を使うと、キーが存在しない場合のデフォルト値を指定できるため、存在確認を省略できます。
4-3. キー名そのものを変更したい場合
Pythonの辞書にはキー名を直接変更する機能がありません。新しいキーを追加してから古いキーを削除するというステップが必要です。
employee = {'name': 'Alice', 'age': 30, 'dept': 'Engineering'}
# pop()で古いキーを削除しながら値を取得 → 新しいキーに代入
employee['department'] = employee.pop('dept')
print(employee)
# {'name': 'Alice', 'age': 30, 'department': 'Engineering'}
複数キーを一括でリネームしたい場合は、以下のようにまとめて処理できます。
rename_map = {'dept': 'department', 'loc': 'location'}
for old_key, new_key in rename_map.items():
if old_key in employee:
employee[new_key] = employee.pop(old_key)
実務で使える応用テクニック

5-1. ネストされた辞書への要素追加
実務では辞書の中に辞書が入ったネスト構造を扱うことが多くあります。
company = {
'engineering': {'headcount': 10, 'location': 'Tokyo'},
'product': {'headcount': 5, 'location': 'Osaka'}
}
# ネストされた辞書に要素を追加
company['engineering']['remote'] = True
print(company['engineering'])
# {'headcount': 10, 'location': 'Tokyo', 'remote': True}
# 新しい部署(ネスト辞書)を追加
company['design'] = {'headcount': 3, 'location': 'Tokyo'}
5-2. defaultdictを使ってKeyErrorを防ぐ
collections.defaultdictは、存在しないキーにアクセスしたときに自動でデフォルト値を生成する辞書です。
from collections import defaultdict
# デフォルト値の型を指定(ここではlist)
word_positions = defaultdict(list)
text = 'apple banana apple cherry banana apple'
for i, word in enumerate(text.split()):
word_positions[word].append(i)
print(dict(word_positions))
# {'apple': [0, 2, 5], 'banana': [1, 4], 'cherry': [3]}
通常の辞書ではKeyErrorが発生するところを、defaultdictは自動でリストを初期化してくれます。詳細はPython公式ドキュメントを参照してください。
5-3. Counterを使った集計辞書の作成
単語や要素の出現回数を数えるなら、collections.Counterが便利です。
from collections import Counter
words = ['apple', 'banana', 'apple', 'cherry', 'banana', 'apple']
counter = Counter(words)
print(counter)
# Counter({'apple': 3, 'banana': 2, 'cherry': 1})
# 追加カウントも簡単
counter.update(['banana', 'date'])
print(counter)
# Counter({'apple': 3, 'banana': 3, 'cherry': 1, 'date': 1})
5-4. 辞書内包表記による条件付き追加
既存の辞書をフィルタリング・変換しながら新しい辞書を生成したい場合に使います。
employees = {
'Alice': {'age': 30, 'dept': 'Engineering'},
'Bob': {'age': 25, 'dept': 'Sales'},
'Carol': {'age': 35, 'dept': 'Engineering'},
}
# Engineeringの社員だけを抽出
engineers = {name: info for name, info in employees.items()
if info['dept'] == 'Engineering'}
print(engineers)
# {'Alice': {...}, 'Carol': {...}}
よくある失敗パターンと注意点
6-1. 意図しないキーの上書き
辞書操作で最もよく起きるバグのひとつが、意図しないキーの上書きです。
# NG例:同じキーを誤って再定義してしまう
config = {'timeout': 30, 'retry': 3}
config['timeout'] = 60 # 意図的ならOKだが、気づかず上書きすると危険
# OK例:上書きを防ぎたいならsetdefault()を使う
config.setdefault('timeout', 90) # すでに存在するので変更されない
update()を使ってマージする場合も同様で、後から指定した辞書のキーが優先されます。意図しないマージ順になっていないか確認しましょう。
6-2. 辞書のコピーに関するミス(浅いコピーと深いコピー)
辞書を別変数に代入しても、参照先は同じオブジェクトです。
original = {'name': 'Alice', 'scores': [90, 85, 88]}
# NG:代入は参照コピー(同じオブジェクトを指す)
ref = original
ref['name'] = 'Bob'
print(original['name']) # 'Bob'(元の辞書も変わってしまう)
# OK:浅いコピー(shallow copy)
shallow = original.copy()
shallow['name'] = 'Carol'
print(original['name']) # 'Bob'(変わらない)
# ただし浅いコピーではネストされたオブジェクトは共有される
shallow['scores'].append(95)
print(original['scores']) # [90, 85, 88, 95](元も変わる)
# 完全に独立したコピーが必要なら deepcopy
import copy
deep = copy.deepcopy(original)
deep['scores'].append(100)
print(original['scores']) # [90, 85, 88, 95](変わらない)
copyモジュールの詳細は公式ドキュメントをご確認ください。
6-3. 辞書をループ中に変更するのは危険
辞書をforループで回しながら要素を追加・削除するとRuntimeErrorが発生します。
d = {'a': 1, 'b': 2, 'c': 3}
# NG:ループ中に辞書を変更する
for key in d:
if d[key] > 1:
d['new_key'] = 99 # RuntimeError: dictionary changed size during iteration
# OK:コピーに対してループを回す
for key in list(d.keys()):
if d[key] > 1:
d['new_key'] = 99 # 安全
6-4. 辞書内包表記でのキー重複に注意
辞書内包表記でキーが重複するロジックを書くと、気づかないまま上書きが起きます。
# NG例:名前の最初の1文字をキーにする(重複が発生しうる)
names = ['Alice', 'Amanda', 'Bob']
initial_dict = {name[0]: name for name in names}
print(initial_dict)
# {'A': 'Amanda', 'B': 'Bob'} ← 'Alice'が上書きされている
# OK:重複を意識した設計に変える
from collections import defaultdict
initial_dict = defaultdict(list)
for name in names:
initial_dict[name[0]].append(name)
print(dict(initial_dict))
# {'A': ['Alice', 'Amanda'], 'B': ['Bob']}
Pythonバージョンによる辞書の違いまとめ

| バージョン | 変更点 |
|---|---|
| Python 3.6 | CPython実装として挿入順が保持されるようになる(非公式) |
| Python 3.7 | 辞書の挿入順保持が言語仕様として正式に保証される |
| Python 3.5 | **アンパック演算子が複数辞書のマージに使えるようになる |
| Python 3.9 | ` |
Python公式の変更履歴はこちらでも確認できます。
まとめ

この記事で解説した辞書への要素追加・更新方法を整理します。
追加・更新の方法まとめ:
| 方法 | 用途 | 破壊的か |
|---|---|---|
dict[key] = value |
1件追加・更新 | ○(インプレース) |
setdefault(key, default) |
キーが存在しない場合のみ追加 | ○(インプレース) |
update({...}) |
複数件の追加・更新 | ○(インプレース) |
{**d1, **d2} |
辞書のマージ(非破壊) | ✗(新しい辞書を生成) |
d1 | d2(3.9以降) |
辞書のマージ(非破壊) | ✗(新しい辞書を生成) |
d1 |= d2(3.9以降) |
辞書のマージ(インプレース) | ○(インプレース) |
次のステップとして取り組むべきこと:
defaultdictやCounterなど、collectionsモジュールの辞書系クラスを試す- 実際のAPIレスポンス(JSON)を辞書として処理するコードを書いてみる
- ネスト辞書の操作や
deepcopyとの使い分けを実践で確認する - Python 3.9以降の
|演算子を積極的に取り入れる
辞書はPythonプログラミングの中核を担うデータ構造です。今回解説した操作を確実に使いこなせるようになると、コードの品質と生産性が大きく向上します。
Pythonを深く理解しながら働きたい方へ
ここまで読んでくださった方は、単に「動くコードが書ければいい」ではなく、なぜそう動くのかを理解しながらエンジニアとして成長したいという意識をお持ちではないでしょうか。
私たちのチームは、Pythonをはじめとした技術の本質を大切にしながら、プロダクト開発に取り組んでいます。「コードの品質」「設計の意図」「チームでの知識共有」を重視するカルチャーのなかで、一緒に手を動かしてくれる仲間を探しています。
技術が好きで、学ぶことを楽しめるエンジニアの方——ぜひ私たちの採用ページをのぞいてみてください。あなたのキャリアの次のステップが、ここにあるかもしれません。
Pythonエンジニアを目指している方へ
「自分も実際にエンジニアとして働いてみたい」と感じた方も多いのではないでしょうか。
未経験からエンジニアになるためには、
- 実務を見据えたカリキュラムで基礎を固められるか
- 現場に入ってからもサポートしてもらえる環境があるか
を意識して会社を選ぶことで、入社後の成長スピードが大きく変わります。
そうした「入社後も安心して成長できる環境」を探している方には、
未経験者の育成に力を入れたSES企業 ZeroCode PLUS という選択肢もあります。
- エンジニアスキルを体系的に学べる
- 未経験者でも実務を意識したカリキュラムで基礎から丁寧にサポート
- 研修から現場アサインまで一貫したフォロー体制
- 完全オンライン対応でスキマ時間を活用した学習が可能
※話を聞くだけ・内容を確認するだけでも大歓迎です