首页 > 解决方案 > 用子字典中的一个替换父键值?

问题描述

我有一个dict如下:

{'data': 'v1', 'data2': {'xyz': 'ABC' }}

我想要一个dict赞:

{'data': 'v1', 'data2': 'ABC'}

基本上我想使用'data2'要分配给的键的值'data2'

这是一个深度嵌套的多层递归字典。

标签: python

解决方案


我正在通过翻译一些 JSON 字段来解决类似的问题。

在入口处,我有一个嵌套文档,其中包含一个带有不同语言翻译的嵌套对象:

json_data = {
      "title": {
        "uk": "title 1 uk",
        "ru": "title 2 uk",
        "en": "title 3 uk"
      },
      "items": [
        {
          "subcategory": {
            "uk": "subcategory 1 uk",
            "ru": "subcategory 1 ru",
            "en": "subcategory 1 en"
          },
          "items": [
            {
              "id": 1,
              "title": {
                "en": "title en 1",
                "ru": "title ru 1",
                "uk": "title uk 2"
              }
            },
            {
              "id": 2,
              "title": {
                "en": "title en 1.2",
                "ru": "title ru 1.2",
                "uk": "title uk 1.2"
              }
            }
          ]
        },
        {
          "subcategory": {
            "uk": "subcategory 1.2 uk",
            "ru": "subcategory 1.2 ru",
            "en": "subcategory 1.2 en"
          },
          "items": [
            {
              "id": 2,
              "title": {
                "en": "title en 2.2",
                "ru": "title ru 2.2",
                "uk": "title uk 2.2"
              }
            }
          ]
        }
      ]
    }

有一个递归生成器,接受一个文档作为输入,以及我要查找的键的名称,其值将作为父键的值返回。

def i18n_generator(json_input={}, language="en"):

    if isinstance(json_input, dict):
        for k, v in json_input.items():
            if isinstance(v, dict) and language in v:
                """
                    if value is a dict and contains the required field, 
                    set to the parent key value from nested object
                """
                json_input[k] = v.get(language, None)
                yield
            else:
                yield from i18n_generator(v, language)

    elif isinstance(json_input, list):
        # if the document contains a list of dictionaries
        for item in json_input:
            yield from i18n_generator(item, language)

# run generator
for _ in i18n_generator(json_data, language="uk"):
    pass

print(json_data)

输出:

{'title': 'title 1 uk', 'items': [{'subcategory': 'subcategory 1 uk', 'items': [{'id': 1, 'title': 'title uk 2'}, {'id': 2, 'title': 'title uk 1.2'}]}, {'subcategory': 'subcategory 1.2 uk', 'items': [{'id': 2, 'title': 'title uk 2.2'}]}]

推荐阅读