【python】dictデータ内の文字列置換の仕方

python

備忘録も兼ねて、pythonのdict型データ内の文字列を置換する方法です。
tuple型を含むと単純にできないので、工夫が必要です。

tuple型を含まないdict

import json
if __name__ == "__main__":
    test_dict1 = {
        'key001': {'teststr':'value001'}
    }
    test_dict1_after = json.dumps(test_dict1)
    test_dict1_after = test_dict1_after.replace('value','VALUE')
    test_dict1_after = json.loads(test_dict1_after)

    print(test_dict1)
    # 置換前のdict出力 -> {'key001': {'teststr': 'value001'}}
    print(test_dict1_after)
    # 置換後のdict出力 -> {'key001': {'teststr': 'VALUE001'}}

tuple型データがないdict型データであれば

  • json.dumpsdict型→str型に変換
  • replaceで文字列を置換
  • json.loadsstr型→dict型に変換

の手順で置換できます。1行で書くとこんな感じになります。

test_dict1_after = json.loads(json.dumps(test_dict1).replace('value','VALUE'))

keyがtuple型のdict

※value部分の文字列のみ置換できる方法です。

import json
if __name__ == "__main__":
    test_dict2 = {
        ('tuple001_a','tuple001_b'): {'teststr':'value001'}
    }

    keys = list(test_dict2.keys())
    values = list(test_dict2.values())
    values = json.loads(json.dumps(values).replace('value','VALUE'))
    test_dict2_after = dict(zip(keys, values))

    print(test_dict2)
    # 置換前のdict出力 -> {('tuple001_a', 'tuple001_b'): {'teststr': 'value001'}}
    print(test_dict2_after)
    # 置換後のdict出力 -> {('tuple001_a', 'tuple001_b'): {'teststr': 'VALUE001'}}

tuple型が入ったdict型データは、json.dumpsでは以下のエラーが発生し、文字列に変換できません。
TypeError: keys must be str, int, float, bool or None, not tuple

そのため、

  • dict.keys()とdict.values()でkeyのリストとvalueのリストを取り出す
  • valueのリストのデータを「tuple型を含まないdict」に書いた方法で置換
  • keyのリストとvalueのリストをつなげて、dict型データを再構築する

という流れで置換しています。
1行で書くとこんな感じになります。

test_dict2_after = dict(zip(list(test_dict2.keys()), json.loads(json.dumps(list(test_dict2.values())).replace('value','VALUE'))))

Follow me!

コメント

PAGE TOP
タイトルとURLをコピーしました