#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]}