辞書.update() / 辞書.pop() / 辞書.clear()
| 対応: | Python 2(2000) |
|---|
辞書を更新・削除するメソッドです。辞書へのマージや特定キーの削除、全クリアまで対応します。
構文
# 別の辞書またはキーと値のペアで辞書を更新(既存キーは上書き) 辞書.update(他の辞書またはキーワード引数) # 指定したキーを削除して値を返す。キーが存在しない場合はデフォルト値を返す 辞書.pop(キー, デフォルト値) # 最後に挿入されたキーと値のペアを削除して返す(Python 3.7以降は挿入順が保証) 辞書.popitem() # 辞書のすべての要素を削除(辞書オブジェクト自体は残る) 辞書.clear() # 特定のキーと値を削除(戻り値なし) del 辞書[キー]
関数一覧
| メソッド・構文 | 概要 |
|---|---|
| dict.update(other) | 辞書を other の内容で更新します。既存キーの値は上書きされ、新しいキーは追加されます。戻り値は None です。 |
| dict.pop(key, default) | 指定したキーを削除してその値を返します。キーが存在しない場合は default を返します。default を省略してキーがない場合は KeyError が発生します。 |
| dict.popitem() | 最後に挿入されたキーと値のペアを(key, value)タプルとして削除して返します。辞書が空の場合は KeyError が発生します。 |
| dict.clear() | 辞書のすべての要素を削除して空の辞書にします。戻り値は None です。 |
| del dict[key] | 指定したキーと値のペアを削除します。値は返されません。 |
サンプルコード
dict_update_pop.py
# update() で辞書を更新
user = {"name": "岡部倫太郎", "age": 18}
updates = {"age": 19, "org": "未来ガジェット研究所"} # age を更新、org を追加
user.update(updates)
print(user) # {'name': '岡部倫太郎', 'age': 19, 'org': '未来ガジェット研究所'}
# キーワード引数でも更新できる
user.update(email="okabe_rintaro@wp-p.info", lab_no=8)
print(user) # email と lab_no が追加されます。
# Python 3.9以降では | 演算子(マージ)と |= 演算子(更新)が使える
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 20, "c": 30}
merged = dict1 | dict2 # 新しい辞書を作成(dict1 は変わらない)
print(merged) # {'a': 1, 'b': 20, 'c': 30}
dict1 |= dict2 # dict1 を直接更新
print(dict1) # {'a': 1, 'b': 20, 'c': 30}
# pop() でキーを削除して値を取り出す
profile = {"name": "牧瀬紅莉栖", "age": 18, "temp_token": "abc123"}
token = profile.pop("temp_token") # 削除して値を取得
print(token) # abc123
print(profile) # {"name": "牧瀬紅莉栖", "age": 18}
# デフォルト値を指定して存在しないキーを安全に削除
removed = profile.pop("phone", None)
print(removed) # None(エラーなし)
# popitem() で最後に追加したキーと値を取り出す
data = {"x": 1, "y": 2, "z": 3}
last = data.popitem()
print(last) # ('z', 3)(最後に挿入された要素)
print(data) # {'x': 1, 'y': 2}
# del でキーを削除(値は返されない)
settings = {"theme": "dark", "lang": "ja", "debug": True}
del settings["debug"]
print(settings) # {'theme': 'dark', 'lang': 'ja'}
# clear() ですべての要素を削除
settings.clear()
print(settings) # {}(空の辞書)
# 辞書のフィルタリング(特定の条件を満たすキーだけ残す)実用例
config = {
"host": "localhost",
"port": 5432,
"debug": True,
"password": "secret",
"timeout": 30
}
# パスワードを含む設定をログ用に安全に複製
safe_config = {k: v for k, v in config.items() if k != "password"}
print(safe_config) # password キーが除外されます。
実行すると次のように出力されます。
python3 dict_update_pop.py
{'name': '岡部倫太郎', 'age': 19, 'org': '未来ガジェット研究所'}
{'name': '岡部倫太郎', 'age': 19, 'org': '未来ガジェット研究所', 'email': 'okabe_rintaro@wp-p.info', 'lab_no': 8}
{'a': 1, 'b': 20, 'c': 30}
{'a': 1, 'b': 20, 'c': 30}
abc123
{'name': '牧瀬紅莉栖', 'age': 18}
None
('z', 3)
{'x': 1, 'y': 2}
{'theme': 'dark', 'lang': 'ja'}
{}
{'host': 'localhost', 'port': 5432, 'debug': True, 'timeout': 30}
よくあるミス
よくあるミス1: pop()でキーが存在しない場合のエラー
『pop(key)』はキーが存在しない場合に『KeyError』が発生します。デフォルト値を指定するとエラーを回避できます。
lab = {'岡部倫太郎': 'ラボ長', '牧瀬紅莉栖': '研究員', '椎名まゆり': 'コスプレイヤー'}
# 存在しないキーをpop()するとKeyError
try:
lab.pop('橋田至') # KeyError: '橋田至'
except KeyError as e:
print(f'キーが見つかりません: {e}')
次のように記述します。
# デフォルト値を指定するとエラーを回避
role = lab.pop('橋田至', '未登録')
print(role) # '未登録'(エラーなし)
よくあるミス2: update()で意図せず上書きされる
『update()』は既存のキーを上書きします。既存のキーを保持したい場合は、事前に確認するか『setdefault()』を使います。
lab = {'岡部倫太郎': 'ラボ長', '牧瀬紅莉栖': '研究員'}
new_data = {'牧瀬紅莉栖': 'タイムトラベラー', '阿万音鈴羽': 'バイト'}
# update()は既存キーを上書きする
lab.update(new_data)
print(lab['牧瀬紅莉栖']) # 'タイムトラベラー'(研究員が消えた)
次のように記述します。
# 既存キーを保持したい場合はsetdefault()
lab2 = {'岡部倫太郎': 'ラボ長', '牧瀬紅莉栖': '研究員'}
for key, value in new_data.items():
lab2.setdefault(key, value) # 既存キーは変更しない
print(lab2['牧瀬紅莉栖']) # '研究員'(保持された)
print(lab2['阿万音鈴羽']) # 'バイト'(新規は追加された)
概要
『update()』は辞書同士のマージに使います。既存キーの値は無条件に上書きされるため、「既存の値を保持したい場合」には使えません。既存のキーを保持しながら新しいキーだけを追加したい場合は、引数の順序を入れ替えるか、『setdefault()』を使ってください。
『pop()』はキーを削除しながらその値を使いたい場合に便利です。存在しないキーをデフォルト値なしで『pop()』すると『KeyError』が発生します。これはリストの『pop()』と同様の挙動です。
Python 3.9以降では『|』演算子(マージ)と『|=』演算子(更新)が追加されました。『dict1 | dict2』は新しい辞書を返すため元の辞書は変更されません(『update()』と同様の動作は『|=』です)。辞書のキー・値の確認については『辞書.keys() / values() / items()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。