Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Составной словарь в Python с несколькими значениями из других словарей по идентичному ключу

#python #словари


Сразу оговорюсь – я не программист, а изучаю Python для собственных конкретных целей
(обработка данных, полученных из сети), поэтому если мой вопрос покажется наивным и
простым – прошу не пенять.

Итак, есть три разных словаря с идентичными ключами. Значения – разные, но могут
совпадать как в пределах одного словаря, так и в разных словарях.
Например (значения сделал в виде списка, поскольку понимаю, что по-другому добавлять
значения к одному ключу не выйдет):

dict_1={'a': [2],
    'b': [8],
    'c': [6],
    'd': [2]}

dict_2={'a': [2],
    'b': [7],
    'c': [7],
    'd': [3]}

dict_3={'a': [3],
    'b': [6],
    'c': [8],
    'd': [3]}


Задача: получить новый словарь (либо с нуля, либо на основе одного из указанных –
совершенно не важно) в котором каждый ключ получит значения от всех трёх словарей:

dict_all={'a': [2, 2, 3],
      'b': [8, 7, 6],
      'c': [6, 7, 8],
      'd': [2, 3, 3]}

    


Ответы

Ответ 1



Вариант решения с использованием модуля Pandas: import pandas as pd # pip install pandas res = pd.concat([pd.DataFrame(d) for d in [dict_1, dict_2, dict_3]]).to_dict('list') результат: {'a': [2, 2, 3], 'b': [8, 7, 6], 'c': [6, 7, 8], 'd': [2, 3, 3]} в виде Pandas.DataFrame: In [7]: pd.concat([pd.DataFrame(d) for d in [dict_1, dict_2, dict_3]]) Out[7]: a b c d 0 2 8 6 2 0 2 7 7 3 0 3 6 8 3

Ответ 2



import copy dict_all = copy.deepcopy(dict_1) for loop_dict in dict_2, dict_3: for k, v in loop_dict.items(): try: dict_all[k].extend(v) except KeyError: dict_all[k] = v Если сохранность в исходном виде dict_1 не нужна, можно обойтись без его глубокого копирования. Перехват ислкючения нужен на случай, если в dict_1 нет каких-либо ключей, встречающихся в других словарях.

Ответ 3



dict_all = {} for key in dict_1: dict_all[key] = [d[key][0] for d in (dict_1, dict_2, dict_3)] Примечание: Исходные словари не нужны иметь в качестве значений списки - в том случае просто удалите в моем решении [0] (служащего для выбора первого - единого - элемента исходных списков).

Ответ 4



Оптимально не привязывать необходимый набор ключей к какому-либо "рабочему" словарю, в следующей функции набор ключей вынесен в качестве параметра. В ваших словарях значения представлены списками с одним элементом, удобно привести их к общему базовому виду с помощью отдельной функции-фильтра def general_dict(key_list, ad, bd, cd): result = {} for key in key_list: t = [] for d in [ad, bd, cd]: try: t.append(d[key]) except KeyError: pass result[key] = t return result def dict_filter(dict): y = {} for x in dict: y[x] = dict[x][0] return y dict_1={'a': [2], 'b': [8], 'c': [6], 'd': [2]} dict_2={'a': [2], 'b': [7], 'c': [7], 'd': [3]} dict_3={'a': [3], 'b': [6], 'c': [8], 'd': [3]} print dict_filter(dict_1) # {'a': 2, 'c': 6, 'b': 8, 'd': 2} print general_dict(['a', 'b', 'c', 'd'], dict_filter(dict_1), dict_filter(dict_2), dict_filter(dict_3)) # {'a': [2, 2, 3], 'c': [6, 7, 8], 'b': [8, 7, 6], 'd': [2, 3, 3]}

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

Отправить комментарий