如何将字典值映射到另一个字典

时间:2020-11-05 13:08:58

标签: python dictionary

我的字典在下面

{
    "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 } 
            ] 
         } 
    }
} 
  • aggregations.keys将是aggregationfilters.fieldName

  • aggregations.buckets.key将是gregationfilters.values.title

  • aggregationfilters.values.paragraph每次为空

  • aggregations.buckets.doc_count将是aggregationfilters.values.count

  • 基本上,我需要提取aggregations.keys和aggregations.bucket值并将其放入不同的字典中。

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

我无法使用.pop(重命名)专制

我的期望值

{
    "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 }
            ] 
        }
    ]
}

1 个答案:

答案 0 :(得分:1)

嗯,这行得通,但是即使尽我最大的努力,看起来还是不太干净。

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"
    }
  ]
}

始终显示您的代码,如果那是可行的代码,那将是很好的-表示您已为解决问题付出了至少应有的努力。

我不打扰,因为这就像解决难题一样,但是其他人可能不会。