| この記事の要点 |
|
5 つの削除方法
| 方法 | 戻り値 | キー無いとき | 用途 |
|---|---|---|---|
del d['k'] | なし | KeyError | キーが必ずある前提 |
d.pop('k') | 削除した値 | KeyError | 値を使いたい場合 |
d.pop('k', None) | 削除した値 or default | default を返す | 安全に削除 |
d.popitem() | (key, value) タプル | KeyError (空 dict) | 末尾削除(LIFO) |
d.clear() | なし | — | 全クリア |
1. del
d = {'a': 1, 'b': 2, 'c': 3}
del d['a']
print(d) # {'b': 2, 'c': 3}
# キーが無いと KeyError
del d['x'] # KeyError: 'x'
# 安全に消したい場合は in でチェック
if 'x' in d:
del d['x']
2. pop() — 値を取得しつつ削除
d = {'a': 1, 'b': 2, 'c': 3}
# 値を取得して削除
v = d.pop('a')
print(v) # 1
print(d) # {'b': 2, 'c': 3}
# キー無い + default 無し → KeyError
d.pop('x') # KeyError: 'x'
# default 指定で安全削除
v = d.pop('x', None)
print(v) # None
print(d) # {'b': 2, 'c': 3}
# よくあるイディオム
config = {'host': 'localhost', 'port': 8080}
port = config.pop('port', 80) # 取り出しつつ削除
3. popitem() — 最後の要素を取り出す
Python 3.7 以降、辞書は挿入順を保持します。popitem() は最後に追加された要素を削除して返します。
d = {'a': 1, 'b': 2, 'c': 3}
k, v = d.popitem()
print(k, v) # 'c' 3
print(d) # {'a': 1, 'b': 2}
# 空辞書では KeyError
d.popitem() # OK
d.popitem() # OK
d.popitem() # KeyError: 'dictionary is empty'
# 全要素取り出しイテレーション(LIFO)
while d:
k, v = d.popitem()
print(f'{k} = {v}')
4. clear() — 全部消す
d = {'a': 1, 'b': 2}
d.clear()
print(d) # {}
# clear と {} 代入の違い (重要)
d1 = {'a': 1}
d2 = d1 # 同じ dict を参照
d1.clear() # 元 dict を空に → d2 も空
print(d2) # {}
d1 = {'a': 1}
d2 = d1
d1 = {} # 新しい空 dict を d1 に代入 → d2 は元のまま
print(d2) # {'a': 1}
5. 条件で複数キー削除 — 内包表記が安全
イテレート中の dict を del すると RuntimeError になります:
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
# ❌ NG: イテレート中の削除
for k in d:
if d[k] % 2 == 0:
del d[k]
# RuntimeError: dictionary changed size during iteration
# ✅ OK 1: キーをリスト化してから
for k in list(d.keys()):
if d[k] % 2 == 0:
del d[k]
# ✅ OK 2: 内包表記で新しい dict
d = {k: v for k, v in d.items() if v % 2 != 0}
print(d) # {'a': 1, 'c': 3}
# ✅ OK 3: 残すキーのリストで filter
keep_keys = {'a', 'c'}
d = {k: v for k, v in d.items() if k in keep_keys}
defaultdict の挙動
defaultdict でも削除は同じですが、削除後にアクセスすると再生成される点に注意:
from collections import defaultdict
d = defaultdict(list)
d['a'].append(1)
print(d) # defaultdict(<class 'list'>, {'a': [1]})
del d['a']
print(d) # defaultdict(<class 'list'>, {})
# 削除済みのキーにアクセスすると default で再生成
_ = d['a']
print(d) # defaultdict(<class 'list'>, {'a': []})
性能比較
| 操作 | 計算量 | 備考 |
|---|---|---|
| del d['k'] / pop | 平均 O(1) | ハッシュテーブル |
| popitem() | O(1) | 末尾削除 |
| clear() | O(N) | 全要素処理 |
| 内包表記で再構築 | O(N) | 全要素走査 |
FAQ
Q: ループ中に一部のキーだけ消したい
A: for k in list(d.keys()) で copy を取ってからループ、または内包表記で再構築。直接 for k in d: 中に削除すると RuntimeError。
Q: 値が None の要素だけ消す
A: d = {k: v for k, v in d.items() if v is not None}
Q: 「キーがあれば消す、無くてもエラーにしない」最短は?
A: d.pop('key', None)。1 行で済むしパフォーマンスも良好。
子ページ
子ページはありません
同階層のページ
- 辞書の作成
- 値の参照
- 要素の追加と更新
- 要素の削除 (辞書 Python)
- キーの存在チェック
- dictの中身を確認する方法
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Oracle 19cの索引再構築|REBUILDの判断・ONLINEと制約 2026-10-26 18:52:58
- Oracle 19cのCREATE INDEX|UNIQUE・BITMAP・TABLESPACE・ONLINEと製品比較 2026-10-26 18:52:56
- Oracle 19cの列定義変更|MODIFYの型・属性保持と既存NULL 2026-10-26 18:15:03
- Oracle 19cの列追加|ADD・DEFAULTと既存行・NOT NULLの条件 2026-10-26 18:15:03
- Oracle 19cのCREATE TABLE|型・制約・外部キーとCTASの注意点 2026-10-26 18:15:00
- Oracle 19cのDROP INDEX|制約依存・ONLINEとINVISIBLE 2026-10-26 17:21:20
- Oracle 19cのDROP TABLE|CASCADE・PURGEと復旧条件 2026-10-26 17:21:20
- Oracle 19cのカラム削除|DROP COLUMN・SET UNUSEDと依存・取消条件 2026-10-26 17:21:19
- Oracle 19cの索引操作|作成・再構築・削除と製品別の比較 2026-10-26 16:39:47
- Oracle 19cの表DDL|表操作の選び方とCREATE・ALTER・DROP・TRUNCATE 2026-10-26 16:39:47
- TRUNCATE TABLEの注意点|空の子表でも残る外部キーと製品別の取消条件 2026-10-26 16:39:45
- Oracle 19cのSAVEPOINT|部分ロールバック・COMMIT・DDLの境界 2026-10-26 15:51:40
- Oracle 19cのUPDATE文|更新件数・NULL・相関サブクエリ・MERGE 2026-10-26 15:51:40
- Oracle 19cのHAVING句|WHEREとの違い・NULL・集計条件 2026-10-26 15:51:40
- Oracleの制約|NOT NULL・UNIQUE・主キー・外部キー・CHECK 2026-10-26 15:51:38