Скажем, у меня есть список словарей неизвестной длины и неизвестной, но согласованной схемы, следующим образом. Обратите внимание, что значения всегда являются списками одинаковой длины.

res = [{'x': [2, 1], 'v': [49280, 536704]},
 {'x': [1, 4], 'v': [12336, 340000]},
 {'x': [5, 6], 'v': [524360, 151624]},
 {'x': [7, 1], 'v': [94280, 81968]},
 {'x': [1, 1], 'v': [241856, 335904]},
 {'x': [7, 7], 'v': [463016, 598040]},
 {'x': [2, 9], 'v': [606256, 422016]},
 {'x': [1, 1], 'v': [151680, 1237120]}]

Есть ли эффективный способ объединить их в один словарь? Окончательный результат для этого примера:

 {'x': [2, 1, 1, 4, 5, 6, 7, 1, 1, 1, 7, 7, 2, 9, 1, 1], 
  'v': [49280, 536704, 12336, 340000, 524360, 151624, 94280, 81968, 241856, 335904, 463016, 598040, 606256, 422016, 151680, 1237120]}

Рабочий раствор

Это работает, но мне интересно, будет ли однострочник для этой операции?

output_dct = {}
for dct in res:
    for k, v in dct.items():
        output_dct[k] = v if k not in output_dct.keys() else output_dct[k] + v
0
Andy 7 Май 2020 в 17:11

2 ответа

Лучший ответ

Немного лучший подход с использованием dict.setdefault

< Сильный > Пример:

output_dct = {}
for dct in res:
    for k, v in dct.items():
        output_dct.setdefault(k, []).extend(v)

Или используя collections.defaultdict

from collections import defaultdict
output_dct = defaultdict(list)
for dct in res:
    for k, v in dct.items():
        output_dct[k].extend(v)

print(output_dct)

< Сильный > Вывод :

{'x': [2, 1, 1, 4, 5, 6, 7, 1, 1, 1, 7, 7, 2, 9, 1, 1], 
'v': [49280, 536704, 12336, 340000, 524360, 151624, 94280, 81968, 241856, 335904, 463016, 598040, 606256, 422016, 151680, 1237120]}
1
Rakesh 7 Май 2020 в 14:16

Вы говорите, один вкладыш? Для понимания мобильного!

>>> {k: sum((d[k] for d in res), []) for d in res for k in d}
{'x': [2, 1, 1, 4, 5, 6, 7, 1, 1, 1, 7, 7, 2, 9, 1, 1], 'v': [49280, 536704, 12336, 340000, 524360, 151624, 94280, 81968, 241856, 335904, 463016, 598040, 606256, 422016, 151680, 1237120]}

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

1
Samwise 7 Май 2020 в 14:18