首页 > 解决方案 > 如何将字典值映射到另一个字典

问题描述

我有下面的字典

{
    "aggregations": { 
        "A": { 
            "doc_count_error_upper_bound": 0, 
            "sum_other_doc_count": 0, 
            "buckets": [ 
                { "key": "ADL", "doc_count": 1 },
                { "key": "SDD", "doc_count": 1 }, 
                { "key": "JJD", "doc_count": 1 }
            ] 
        }, 
        "B": { 
            "doc_count_error_upper_bound": 0, 
            "sum_other_doc_count": 0, 
            "buckets": [ 
                { "key": "ABC", "doc_count": 1 }, 
                { "key": "CDE", "doc_count": 1 }, 
                { "key": "FGH", "doc_count": 1 } 
            ] 
        }, 
        "C": { 
            "doc_count_error_upper_bound": 0, 
            "sum_other_doc_count": 0, 
            "buckets": [ 
                { "key": "XYX", "doc_count": 1 }, 
                { "key": "NXS", "doc_count": 1 } 
            ] 
         } 
    }
} 

需要编写一个通用的代码结构来做到这一点。

我不能用 .pop(rename) 字典

我的预期

{
    "aggregationfilters": [ 
        { 
            "name": "ABC", 
            "fieldName": "A", 
            "values": [ 
                { "title": "ADL", "paragraph": null, "count": 1 }, 
                { "title": "SDD", "paragraph": null, "count": 1 }, 
                { "title": "JJD", "paragraph": null, "count": 1 }
            ] 
        }, { 
            "name": "CDE", 
            "fieldName": "B", 
            "values": [ 
                { "title": "ABC", "paragraph": null, "count": 1 }, 
                { "title": "CDE", "paragraph": null, "count": 1 }, 
                { "title": "FGH", "paragraph": null, "count": 1 } 
            ] 
        }, { 
            "name": "FGH", 
            "fieldName": "C", 
            "values": [ 
                { "title": "XYX", "paragraph": null, "count": 1 }, 
                { "title": "NXS", "paragraph": null, "count": 1 }
            ] 
        }
    ]
}

标签: pythondictionary

解决方案


好吧,这行得通,但即使我尽了最大的努力,这看起来仍然不是那么干净。

import json

source = {
    "aggregations": {
        "A": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {"key": "ADL", "doc_count": 1},
                {"key": "SDD", "doc_count": 1},
                {"key": "JJD", "doc_count": 1},
            ],
        },
        "B": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {"key": "ABC", "doc_count": 1},
                {"key": "CDE", "doc_count": 1},
                {"key": "FGH", "doc_count": 1},
            ],
        },
        "C": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [{"key": "XYX", "doc_count": 1}, {"key": "NXS", "doc_count": 1}],
        },
    }
}


convert_map = {
    "buckets": "values",
    "doc_count": "count",
    "key": "title",
}

remove_map = {"sum_other_doc_count", "doc_count_error_upper_bound"}

add_map = {"name": "Changed VAL_", "fieldName": "VAL_"}


def converting_generator(
    source_: dict, convert_map_: dict, remove_map_: set, add_map_: dict
):
    working_dict = {k: v for k, v in source_.items()}
    variable_identifier = "VAL_"

    for key, inner_dic in working_dict.items():
        inner_dic: dict
        for rm_key in remove_map_:
            try:
                inner_dic.pop(rm_key)
            except KeyError:
                pass

        for add_key, add_val in add_map_.items():
            inner_dic[add_key] = add_val.replace(variable_identifier, key)

        dumped = json.dumps(inner_dic, indent=2)

        for original, target in convert_map_.items():
            dumped = dumped.replace(original, target)

        yield json.loads(dumped)


converted = {
    "aggregation_filters": list(
        converting_generator(source["aggregations"], convert_map, remove_map, add_map)
    )
}

for inner_dict in converted["aggregation_filters"]:
    for even_inner_dict in inner_dict["values"]:
        even_inner_dict["paragraph"] = None

print(json.dumps(converted, indent=2))

输出:

{
  "aggregation_filters": [
    {
      "values": [
        {
          "title": "ADL",
          "count": 1,
          "paragraph": null
        },
        {
          "title": "SDD",
          "count": 1,
          "paragraph": null
        },
        {
          "title": "JJD",
          "count": 1,
          "paragraph": null
        }
      ],
      "name": "Changed A",
      "fieldName": "A"
    },
    {
      "values": [
        {
          "title": "ABC",
          "count": 1,
          "paragraph": null
        },
        {
          "title": "CDE",
          "count": 1,
          "paragraph": null
        },
        {
          "title": "FGH",
          "count": 1,
          "paragraph": null
        }
      ],
      "name": "Changed B",
      "fieldName": "B"
    },
    {
      "values": [
        {
          "title": "XYX",
          "count": 1,
          "paragraph": null
        },
        {
          "title": "NXS",
          "count": 1,
          "paragraph": null
        }
      ],
      "name": "Changed C",
      "fieldName": "C"
    }
  ]
}

始终显示您的代码,如果这是一个有效的代码,那就太好了 - 表明您至少为您的问题付出了那么大的努力。

我不打扰它,因为这感觉像是解决难题,但其他人可能不会。


推荐阅读