Консолидация списка элементов словарей в словаре

#python #dictionary #consolidation

#python #словарь #консолидация

Вопрос:

У меня ниже сложная структура со словарями с несколькими повторяющимися ключами. Я хочу консолидировать приведенную ниже структуру и вернуть приведенную ниже структуру. Пробовал несколько способов, но не смог его взломать. Пожалуйста, помогите.

Структура ввода:

 {'lst_1': [{"127.0.0.1": [{“key1”:{“asm”: “entry1”, “CHG”: [“entry2”]}}]}, {"127.0.0.1": [{“key1”: {“PL”: “entry3”, “DU”: “entry4”}}]}, {"127.0.0.1": [{“key1”: {“SL”: “entry5”, “DU”: “entry6”}}]}], 'lst_0': [{"127.0.0.1": [{“key2”: {“asm”: “entry7”, “CHG”: [“entry8”]}}]}, {"127.0.0.1": [{“key2: {“PL”: “entry9”, “DU”: “entry10”}}]}, {"127.0.0.1": [{“key2”: {“SL”: “entry11”, “DU”: “entry12”}}]}]}
 

Структура вывода:

 {‘key1’: {‘asm’: ‘entry1’, 'SL': ‘entry5’, 'CHG’: [‘entry2’], 'DU': ‘entry6’, 'PL': ‘entry3’}, ‘key2’: {‘asm’: ‘entry7’, 'SL': ‘entry11’, 'CHG’: [‘entry8’], 'DU': ‘entry12’, 'PL': ‘entry9’}}
 

Ответ №1:

Этот выполняет свою работу.

 def filterDict(complex_dict):
    filtered_dict = {}

    for a in complex_dict.values():
        for b in a:
            for c in b.values():
                for d in c:
                    for e, f in d.items():
                        if e not in filtered_dict:
                            filtered_dict[e] = {}

                        filtered_dict[e].update(f)

    return filtered_dict

complex_dict = {'lst_0': [{'127.0.0.1': [{'key2': {'CHG': ['entry8'],
                                    'asm': 'entry7'}}]},
           {'127.0.0.1': [{'key2': {'DU': 'entry10',
                                    'PL': 'entry9'}}]},
           {'127.0.0.1': [{'key2': {'DU': 'entry12',
                                    'SL': 'entry11'}}]}],
 'lst_1': [{'127.0.0.1': [{'key1': {'CHG': ['entry2'],
                                    'asm': 'entry1'}}]},
           {'127.0.0.1': [{'key1': {'DU': 'entry4',
                                    'PL': 'entry3'}}]},
           {'127.0.0.1': [{'key1': {'DU': 'entry6',
                                    'SL': 'entry5'}}]}]}

print(filteredDict(complex_dict))

## OUTPUT:
# {'key1': {'CHG': ['entry2'],
#           'DU': 'entry6',
#           'PL': 'entry3',
#           'SL': 'entry5',
#           'asm': 'entry1'},
#  'key2': {'CHG': ['entry8'],
#           'DU': 'entry12',
#           'PL': 'entry9',
#           'SL': 'entry11',
#           'asm': 'entry7'}}
 

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

Мне очень любопытно, почему у вас такая структура для вашего словаря. Если вы можете и способны, я предлагаю реструктурировать ваш словарь, чтобы вам не приходилось иметь дело с такого рода вложенными циклами.

Комментарии:

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