python: рекурсивное обновление значений словаря - PullRequest
1 голос
/ 28 февраля 2020

Используя python 3.7, у меня есть словарь, который может иметь значения в виде строк, словарей или списка строк или списка словарей. Вот пример:

{
    "about_me": {
        "age": "{age}"
    },
    "name": {
        "full_name": {
            "first": "{first_name}",
            "last": "{last_name}"
        }
    },
    "addresses": [{
        "home": "{home_address}"
    }, {
        "work": "{work_address}"
    }],
    "phones": [
        "{home_phone}",
        "{work_phone}"
    ]
}

Значения в JSON выглядят следующим образом:

{
    "{age}": 25,
    "{first_name}": "Robert",
    "{last_name}": "Miles",
    "{home_address}": "123 Main St, CA 90111",
    "{work_address}": "456 Wall St, CA 00871",
    "{home_phone}": "18008008001",
    "{work_phone}": "18008018011"
}

Здесь ожидается JSON:

{
    "about_me": {
        "age": "25"
    },
    "name": {
        "full_name": {
            "first": "Robert",
            "last": "Miles"
        }
    },
    "addresses": [{
        "home": "123 Main St, CA 90111"
    }, {
        "work": "456 Wall St, CA 00871"
    }],
    "phones": [
        "18008008001",
        "18008018011"
    ]
}

Пример: все, что я пытаюсь сделать, это ввести значения рекурсивно в словарь about_me. Пример ниже:

person = {
    'first':'Robert',
    'last': 'Miles',
    'age':25
}
print('{first} {last} is {age} years old'.format(**person))
> Robert Miles is 25 years old

То, что я пробовал до сих пор, хорошо для строк, словарей и списка словарей. Он распадается на словарь словарей (xn уровней).

1 Ответ

0 голосов
/ 28 февраля 2020

Вы можете использовать рекурсию с пониманием словаря:

data = {'about_me': {'age': '{age}'}, 'name': {'full_name': {'first': '{first_name}', 'last': '{last_name}'}}, 'addresses': [{'home': '{home_address}'}, {'work': '{work_address}'}], 'phones': ['{home_phone}', '{work_phone}']}
l = {'{age}': 25, '{first_name}': 'Robert', '{last_name}': 'Miles', '{home_address}': '123 Main St, CA 90111', '{work_address}': '456 Wall St, CA 00871', '{home_phone}': '18008008001', '{work_phone}': '18008018011'}
def update(d):
  if not isinstance(d, (dict, list)):
     return l.get(d, d)
  return {a:update(b) if isinstance(b, dict) else list(map(update, b)) if isinstance(b, list)
        else l.get(b, b) for a, b in d.items()}

import json
print(json.dumps(update(data), indent=4))

Вывод:

{
  "about_me": {
    "age": 25
   },
   "name": {
    "full_name": {
        "first": "Robert",
        "last": "Miles"
    }
  },
  "addresses": [
    {
        "home": "123 Main St, CA 90111"
    },
    {
        "work": "456 Wall St, CA 00871"
    }
 ],
  "phones": [
     "18008008001",
     "18008018011"
   ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...