python - объединение / объединение вложенных dict и списка для получения типа значения - PullRequest
0 голосов
/ 04 марта 2020

У меня есть проблема, подобная этой, у меня есть словарь:

{
   "histories":[
      {
         "id":"22167",
         "author":{
            "displayName":"Mommy"
         },
         "items":[
            {
               "field":"resolution",
               "fieldtype":"jira",
            },
            {
               "field":"status",
               "from":"10090",
               "fromString":"Work in progress",
               "to":"10001",
               "toString":"Done"
            }
         ]
      },
      {
         "id":"22131",
         "author":{
            "displayName":"Daddy"
         },
         "created":"2020-02-28T10:04:22.433+0700",
         "items":[
            {
               "field":"assignee",
               "tmpToAccountId":"5c5c29b75bb21413fc41d39b"
            },
            {
               "field":"status",
               "fieldtype":"jira",
               "fieldId":"status",
               "from":"1",
               "fromString":"Open",
               "to":"10090",
               "toString":"Work in progress"
            }
         ]
      }
   ]
}

Мне нужно, чтобы пара данных сопоставления типа ключ-значение для всех вложенных объектов / списков в списке словаря была чем-то вроде это:

{
   "histories":[
      {
         "id":str,
         "author":{
            "displayName":str
         },
         "created":str,
         "items":[
            {
               "field":str,
               "fieldtype":str,
               "fieldId":str,
               "from":str,
               "fromString":str,
               "to":str,
               "toString":str,
               "tmpToAccountId":str

         ]
      }
   ]
}

Так что я могу получить все ключи и типы значений из этого словаря

Как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Попробуйте это:

ОБНОВЛЕНИЕ:

import json

def map_dict(dictionary):
    result = {}
    for key, value in dictionary.items():
        if isinstance(value, dict):
            result[key] = map_dict(value)
        elif isinstance(value, list):
            result[key] = []
            result[key].append(map_dict(value[0]))
        else:
            result[key] = type(value).__name__

    return result

def merge_dicts(*dict_args):
    result = {}
    for dictionary in dict_args:
        for key, value in dictionary.items():
            if isinstance(value, list):
                merged = merge_dicts(*value)
                dictionary[key].clear()
                dictionary[key].append(merged)

        result.update(dictionary)

    return result

def merge_and_map(*dict_args):
    merged = merge_dicts(*dict_args)
    mapped = map_dict(merged)
    return [mapped]

info["histories"] = merge_and_map(*info["histories"])
print(json.dumps(info, indent=4))

Выход:

{
    "histories": [
        {
            "id": "str",
            "author": {
                "displayName": "str"
            },
            "items": [
                {
                    "field": "str",
                    "tmpToAccountId": "str",
                    "fieldtype": "str",
                    "fieldId": "str",
                    "from": "str",
                    "fromString": "str",
                    "to": "str",
                    "toString": "str"
                }
            ],
            "created": "str"
        }
    ]
}
0 голосов
/ 04 марта 2020
import pprint
x = {<your input dict here>}

for i, value in enumerate(x["histories"]):
    new_items = {}
    for item in x["histories"][i]["items"]:
        new_items.update(item)
    x["histories"][i]["items"] = [new_items]

pprint.pprint(x)

В словарях списка "предметов" есть дубликаты ключей, поэтому, если они вам нужны, я не считаю это лучшим способом. Вы можете написать его для обработки дубликатов и переименования их или сохранить то же имя ключа и добавить их к значению в виде списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...