#python-3.x #dictionary #dictionary-comprehension
#python-3.x #словарь #понимание по словарю
Вопрос:
У меня есть следующий сценарий — рассмотрим список словарей, как показано ниже (ввод):
data = [{'key1' : 'k1v1', 'key2': 'k2v1'}, {'key1': 'k1v2', 'key2': 'k2v2'},
{'key1': 'k1v3', 'key2': 'k2v3'}, {'key1': 'k1v4', 'key2': 'k2v4'}]
Как можно заметить, ключи во всех словарях одинаковы. Итак, что я хочу иметь возможность сделать, так это следующее (желаемый результат)::
{'key1': ['k1v1', 'k1v2', 'k1v3', 'k1v4'], 'key2': ['k2v1', 'k2v2', 'k2v3', 'k2v4']}
Чтобы добиться этого, я могу использовать следующий простой прямой вложенный цикл:
data_dict = dict()
for d in data:
for k, v in d.items():
if k in data_dict:
data_dict[k].append(v)
else:
data_dict[k] = [v]
Вопрос: можем ли мы сделать это, используя понимание по словарю? Другими словами, можем ли мы добавлять к существующим спискам значений внутри словарного понимания?
Комментарии:
1. Я не ищу фактической выгоды в производительности, хотя некоторые могут быть; Мне просто любопытно, сможем ли мы достичь этого, используя dictionary-comprehension.
Ответ №1:
Это лучшее, что я могу сделать:
d = {}
for k in data[0].keys():
d[k] = list(d[k] for d in ds)
Вот решение, которое приближается к пониманию dict
data_dict = {
k: [d.get(k) for d in data]
for k in set().union(*data)
}
Следующий синтаксис приводит к коду с самыми быстрыми таймингами:
data_dict = {k: [dt[k] for dt in data] for k in data[0].keys()}
# Timing:
# 1.08 µs ± 18.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Комментарии:
1. @anurag, я обновил свой ответ решением, которое более точно соответствует вашему запросу