如何替换嵌套dict中出现的所有字符串?

2024-09-24 02:24:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python3,我有一些类似于以下的dict:

{
  "test": "asdas",
  "value": "REPLACE_ME",
  "data": {
    "data1": [
      {
        "key1": "REPLACE_ME"
      },
      {
        "key2": "REPLACE_ME"
      },
      {
        "key3": "asdasda"
      }
    ],
    "data2": "REPLACE_ME",
    "data3": [
      "REPLACE_ME",
      "asdasdas",
      "asdasda"
    ]
  }
}

结构不一致。这意味着结构可能不同,并且REPLACE_ME可以位于其他位置。我想迭代数据,并在所有位置用REPLACED替换REPLACE_ME。如果结构是一致的,我只需迭代dict并检查值是否为REPLACE_ME并替换它。但我不知道这座建筑在哪里被清理过。给定一个dict(您不知道是哪一个,它可能有列表、嵌套dict或只是基本字段),如何在所有位置用REPLACED替换REPLACE_ME


Tags: testdatavalue结构dictreplacepython3me
3条回答

这并不漂亮,但应该可以做到:

 exec(f"result = str({your_dict}).replace("REPLACE_ME","REPLACED")")
 print(result)

对于小型json,您可以使用json库获取字符串,然后将其加载回

import json
json_as_text = json.dumps(testingjson)
newdict = json.loads(json_as_text.replace('REPLACE_ME', 'STH_ELSE'))

替换嵌套数据结构中的深层是一个自然的递归问题,因此很自然地使用递归函数来解决它:

def replace_deep(data, a, b):
    if isinstance(data, str):
        return data.replace(a, b)
    elif isinstance(data, dict):
        return {k: replace_deep(v, a, b) for k, v in data.items()}
    elif isinstance(data, list):
        return [replace_deep(v, a, b) for v in data]
    else:
        # nothing to do?
        return data

这里我假设您有类似于JSON的数据,所以您希望在嵌套的字典和列表上递归,而不会有元组、集合或其他容器。如果有,您可以为函数添加额外的案例,以满足您自己的需要

相关问题 更多 >