как объединить два словаря для создания нового в Python?

Скажем, у меня три слова

d1={1:2,3:4} d2={5:6,7:9} d3={10:8,13:22} 

Как создать новый d4 который объединяет эти три словаря? то есть:

  • Как конкатенировать идентификатор, указанный в двух строках?
  • Текстовые файлы для конкатенации Python
  • Конкатенация результатов двух диапазонов
  • Импортируйте несколько файлов excel в pandon pandas и объедините их в один фрейм данных
  •  d4={1:2,3:4,5:6,7:9,10:8,13:22} 

  • Как вы создаете вложенный dict в Python?
  • У Python есть словарь с одноименными ключами?
  • Пересечение двух словарей в Python
  • Как искать, если значение словаря содержит определенную строку с Python
  • В диктовке dicts, как вы эмулируете поведение Auto-vivification Perl?
  • Разделите значения двух словарей на python
  • 5 Solutions collect form web for “как объединить два словаря для создания нового в Python?”

    1. самый медленный: объедините 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 
    2. 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 
    3. middleling: цикл 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 
    4. или, что то же самое, один экземпляр-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) для конкатенированного списка временных структур данных элементов).

     d4 = dict(d1.items() + d2.items() + d3.items()) 

    альтернативно (и предположительно быстрее):

     d4 = dict(d1) d4.update(d2) d4.update(d3) 

    Предыдущий SO вопрос, что оба этих ответа пришли из здесь .

    Вы можете использовать метод update() для создания нового словаря, содержащего все элементы:

     dall = {} dall.update(d1) dall.update(d2) dall.update(d3) 

    Или, в цикле:

     dall = {} for d in [d1, d2, d3]: dall.update(d) 

    Используйте конструктор 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), {}) 

    Вот один лайнер ( 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)) 

    Я немного опаздываю на эту вечеринку, я знаю, но я надеюсь, что это кому-то поможет.

    Python - лучший язык программирования в мире.