note.nkmk.me

Pythonで辞書のキー名を変更

Date: 2019-01-16 / tags: 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}
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事