Python: добавление к списку значений с использованием понимания по словарю

#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, я обновил свой ответ решением, которое более точно соответствует вашему запросу