#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]}
Комментариев нет:
Отправить комментарий