Сведение многоуровневого словаря в одноуровневый словарь - PullRequest
0 голосов
/ 08 января 2020

Я хочу объединить многоуровневый словарь в одноуровневый словарь. Новые одноуровневые ключи должны быть объединены с разделителем "_". Это не дубликат другого плоского вопроса, так как в нем есть массивы, которые объединяются в строку, правильно разделенную.

Входные данные:

{'dates': [
    {'date': '1970-08-01',   'type': 'Date of birth'},
    {'unparsed_date': '1987','type': 'Year of birth'},
    {'date': '2000-00-00',   'type': 'Date of birth2'}
]}

Ожидаемый результат:

{
 'dates_date': '1970-08-01;; 2000-00-00',
 'dates_type': 'Date of birth; Year of birth; Date of birth2',
 'dates_unparsed_date': ';1987'
}

При преобразовании в таблицу:
enter image description here

Я написал функцию из 200 строк, которую я считаю спагетти, и я не буду публиковать здесь, но мой вывод был таким (нет способа исправить, кроме как переписать всю функцию):
Actual ( неправильно) вывод:

{
 'dates_date': '1970-08-01; 2000-00-00',
 'dates_type': 'Date of birth; Year of birth; Date of birth2',
 'dates_unparsed_date': ';1987'
}

1 Ответ

1 голос
/ 08 января 2020

Должно работать следующее:

Код:

d_new = dict()

for k, v in d.items():
    for k2 in set(k for d in v for k in d.keys()):
        d_new[f"{k}_{k2}"] = '; '.join(d2.get(k2, '') for d2 in v)

Выход:

>>> d_new
{'dates_unparsed_date': '; 1987; ',
 'dates_date': '1970-08-01; ; 2000-00-00',
 'dates_type': 'Date of birth; Year of birth; Date of birth2'}

Или, как однострочное словарное понимание:

>>> {f"{k}_{k2}" : '; '.join(d2.get(k2, '') for d2 in v) for k, v in d.items() for k2 in set(k for d in v for k in d.keys())}
{'dates_unparsed_date': '; 1987; ',
 'dates_date': '1970-08-01; ; 2000-00-00',
 'dates_type': 'Date of birth; Year of birth; Date of birth2'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...