Как объединить два словаря для создания нового в Python?
Скажем, у меня три слова
d1={1:2,3:4}
d2={5:6,7:9}
d3={10:8,13:22}
Как создать новый d4
, который объединяет эти три словаря? то есть:.
d4={1:2,3:4,5:6,7:9,10:8,13:22}
Ответы
Ответ 1
-
slowest: объедините items
и вызовите dict
в результирующем списке:
$ python -mtimeit -s'd1={1:2,3:4}; d2={5:6,7:9}; d3={10:8,13:22}' \
'd4 = dict(d1.items() + d2.items() + d3.items())'
100000 loops, best of 3: 4.93 usec per loop
-
fastest: используйте конструктор dict
для рукопожатия, затем один update
:
$ python -mtimeit -s'd1={1:2,3:4}; d2={5:6,7:9}; d3={10:8,13:22}' \
'd4 = dict(d1, **d2); d4.update(d3)'
1000000 loops, best of 3: 1.88 usec per loop
-
middling: цикл update
вызывает исходно-пустой файл dict:
$ python -mtimeit -s'd1={1:2,3:4}; d2={5:6,7:9}; d3={10:8,13:22}' \
'd4 = {}' 'for d in (d1, d2, d3): d4.update(d)'
100000 loops, best of 3: 2.67 usec per loop
-
или, что то же самое, один экземпляр-ctor и два обновления:
$ python -mtimeit -s'd1={1:2,3:4}; d2={5:6,7:9}; d3={10:8,13:22}' \
'd4 = dict(d1)' 'for d in (d2, d3): d4.update(d)'
100000 loops, best of 3: 2.65 usec per loop
Я рекомендую подход (2), и я особенно рекомендую избегать (1) (который также занимает дополнительную вспомогательную память O (N) для конкатенированного списка элементов временной структуры данных).
Ответ 2
d4 = dict(d1.items() + d2.items() + d3.items())
альтернативно (и предположительно быстрее):
d4 = dict(d1)
d4.update(d2)
d4.update(d3)
Предыдущий вопрос SO о том, что оба этих ответа пришли из здесь.
Ответ 3
Вы можете использовать метод update()
для создания нового словаря, содержащего все элементы:
dall = {}
dall.update(d1)
dall.update(d2)
dall.update(d3)
Или, в цикле:
dall = {}
for d in [d1, d2, d3]:
dall.update(d)
Ответ 4
Используйте конструктор dict
d1={1:2,3:4}
d2={5:6,7:9}
d3={10:8,13:22}
d4 = reduce(lambda x,y: dict(x, **y), (d1, d2, d3))
Как функция
from functools import partial
dict_merge = partial(reduce, lambda a,b: dict(a, **b))
Накладные расходы на создание промежуточных словарей могут быть устранены с помощью метода dict.update()
:
from functools import reduce
def update(d, other): d.update(other); return d
d4 = reduce(update, (d1, d2, d3), {})
Ответ 5
Здесь однострочный (imports
не учитывается:), который может быть легко обобщен для объединения N словарей, Python 2.6 +:
from itertools import chain
dict(chain.from_iterable(d.iteritems() for d in (d1, d2, d3))
Вывод:
>>> from itertools import chain
>>> d1={1:2,3:4}
>>> d2={5:6,7:9}
>>> d3={10:8,13:22}
>>> dict(chain.from_iterable(d.iteritems() for d in (d1, d2, d3)))
{1: 2, 3: 4, 5: 6, 7: 9, 10: 8, 13: 22}
Обобщены для объединения N dicts:
from itertools import chain
def dict_union(*args):
return dict(chain.from_iterable(d.iteritems() for d in args))
Я немного опаздываю на эту вечеринку, я знаю, но я надеюсь, что это кому-то поможет.