>>> l1 = [1, 2, 3]
>>> l2 = [4, 5, 6]
>>> l3 = l1 + l2
>>> print(l3)
[1, 2, 3, 4, 5, 6]
А как тоже самое повторить со словарями?>>> d1 = dict(k1=1, k2=2)
>>> d2 = dict(k3=3, k4=4)
>>> d3 = d1+d2
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
Да, словари такой оператор не поддерживают. Самое распространённое решение это метод словаря update()d1.update(d2)
Но это способ изменяет один из словарей, а нам нужно оставить оба словаря нетронутыми и создать третий.Это можно сделать таким способом:
d3 = dict( d1.items() | d2.items() )
Или еще корочеd3 = {**d1, **d2}
Если количество словарей неизвестно и все они в одном списке, то вариантов еще больше.Допустим, есть такой список со словорями:
dict_array = [
{'k1': 1, 'k2': 2},
{'k3': 3, 'k4': 4},
{'k5': 5, 'k6': 6},
]
Для объединения всех в один мегасловарь делаем так:>>> from operator import or_
>>> from functools import reduce
>>> d3 = dict(reduce(or_, [x.items() for x in dict_array]))
{'k3': 3, 'k6': 6, 'k1': 1, 'k4': 4, 'k5': 5, 'k2': 2}
Если важна последовательность ключей, то еще есть способ>>> from itertools import chain
>>> d3 = dict(chain.from_iterable(d.items() for d in dict_array))
{'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4, 'k5': 5, 'k6': 6}
Или так
d3 = dict(chain(*map(dict.items, array)))Есть вариант и покороче
>>> from collections import ChainMap
>>> d3 = dict(ChainMap(*array))>>> print(d3){'k1': 1, 'k5': 5, 'k6': 6, 'k3': 3, 'k2': 2, 'k4': 4}И даже еще короче, в одну строку и с сохранением порядка:
>>> d3 = dict(j for i in array for j in i.items())>>> print(d3){'k': 1, 'k2': 2, 'k3': 3, 'k4': 4, 'k5': 5, 'k6': 6}Можно ещё несколько вариантов придумать, но, думаю, достаточно 😁
__________
Все примеры создают новый словарь, не изменяя старые. Но если в исходных словарях есть другие словари или списки то для независимой копии нужно пройтись еще функцией copy.deepcopy() 😉
#tricks