Pythonで辞書のキー名を変更
Pythonの辞書(dict
型オブジェクト)のキーkey
の名前を変更する方法について説明する。
なお、値value
を変更したい場合はキーを指定して新たな値を代入すればよい。
新たな要素を追加してから古い要素を削除
辞書のキー名を変更するメソッドはないので、新しいキーと元の値で新たな要素を追加してから古い要素を削除するという方法をとる。
辞書の要素の削除についての詳細は以下の記事を参照。
delを使用
del
文を使うと以下のように書ける。
d = {'k1': 1, 'k2': 2, 'k3': 3}
d['k10'] = d['k1']
del d['k1']
print(d)
# {'k2': 2, 'k3': 3, 'k10': 1}
pop()を使用
pop()
メソッドを使うと要素を削除すると同時にそのキーの値が取得できる。
d = {'k1': 1, 'k2': 2, 'k3': 3}
print(d.pop('k1'))
# 1
print(d)
# {'k2': 2, 'k3': 3}
これを利用するとdel
文よりもシンプルに書ける。
d = {'k1': 1, 'k2': 2, 'k3': 3}
d['k10'] = d.pop('k1')
print(d)
# {'k2': 2, 'k3': 3, 'k10': 1}
ただし、デフォルトではpop()
の第一引数に存在しないキーを指定するとエラーとなる。
d = {'k1': 1, 'k2': 2, 'k3': 3}
# print(d.pop('k10'))
# KeyError: 'k10'
pop()
の第二引数に値を指定するとエラーにならずその値を返す。元の辞書オブジェクトは変化なし。
print(d.pop('k10', None))
# None
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3}
これを利用すると、存在しないキーを変更しようとしてしまった場合のデフォルト値を設定できる。次に説明する関数の中で使う。
辞書のキー名を変更する関数を定義
辞書のキー名を変更する関数の例をいくつかのパターンで示す。
元のキーが存在しない場合、新たな要素を追加
pop()
を使った処理は、例えば以下のように関数化できる。
第一引数に対象の辞書、第二引数に元のキー名、第三引数に新たなキー名を指定する。
def change_dict_key(d, old_key, new_key, default_value=None):
d[new_key] = d.pop(old_key, default_value)
d = {'k1': 1, 'k2': 2, 'k3': 3}
change_dict_key(d, 'k1', 'k10')
print(d)
# {'k2': 2, 'k3': 3, 'k10': 1}
元のキーとして存在しないキーを指定すると、第四引数に指定した値(デフォルトではNone
)を持つ新たな要素として追加される。
d = {'k1': 1, 'k2': 2, 'k3': 3}
change_dict_key(d, 'k10', 'k100')
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3, 'k100': None}
d = {'k1': 1, 'k2': 2, 'k3': 3}
change_dict_key(d, 'k10', 'k100', 100)
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3, 'k100': 100}
第三引数の新たなキーに既存のキーを指定すると、既存のキーの値が上書きされる。
d = {'k1': 1, 'k2': 2, 'k3': 3}
change_dict_key(d, 'k1', 'k2')
print(d)
# {'k2': 1, 'k3': 3}
新たなキーに既存のキーを指定したときに既存のキーの値を残したい場合はsetdefault()
メソッドを使う。
def change_dict_key_setdefault(d, old_key, new_key, default_value=None):
d.setdefault(new_key, d.pop(old_key, default_value))
d = {'k1': 1, 'k2': 2, 'k3': 3}
change_dict_key_setdefault(d, 'k1', 'k2')
print(d)
# {'k2': 2, 'k3': 3}
新たなキーが既存のキーでない場合の振る舞いは1つ目の関数と同じ。
d = {'k1': 1, 'k2': 2, 'k3': 3}
change_dict_key_setdefault(d, 'k1', 'k10')
print(d)
# {'k2': 2, 'k3': 3, 'k10': 1}
d = {'k1': 1, 'k2': 2, 'k3': 3}
change_dict_key_setdefault(d, 'k10', 'k100')
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3, 'k100': None}
元のキーが存在しない場合、何もしない
元のキーが存在しない場合は何もしない(新たな要素を追加しない)ようにするには、in
演算子で条件分岐すればよい。辞書に対してはキーに対する存在確認となる。
def change_dict_key_exist(d, old_key, new_key):
if old_key in d:
d[new_key] = d.pop(old_key)
d = {'k1': 1, 'k2': 2, 'k3': 3}
change_dict_key_exist(d, 'k1', 'k10')
print(d)
# {'k2': 2, 'k3': 3, 'k10': 1}
d = {'k1': 1, 'k2': 2, 'k3': 3}
change_dict_key_exist(d, 'k10', 'k100')
print(d)
# {'k1': 1, 'k2': 2, 'k3': 3}
第三引数の新たなキーに既存のキーを指定すると、既存のキーの値が上書きされる。
d = {'k1': 1, 'k2': 2, 'k3': 3}
change_dict_key_exist(d, 'k1', 'k2')
print(d)
# {'k2': 1, 'k3': 3}
上の例と同様に、新たなキーに既存のキーを指定したときに既存のキーの値を残したい場合はsetdefault()
メソッドを使う。
def change_dict_key_exist_setdefault(d, old_key, new_key):
if old_key in d:
d.setdefault(new_key, d.pop(old_key))
d = {'k1': 1, 'k2': 2, 'k3': 3}
change_dict_key_exist_setdefault(d, 'k1', 'k2')
print(d)
# {'k2': 2, 'k3': 3}