Скажем, у меня есть три dictsкак объединить два словаря для создания нового в 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}
Скажем, у меня есть три dictsкак объединить два словаря для создания нового в 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}
d4 = dict(d1.items() + d2.items() + d3.items())
в качестве альтернативы (и, предположительно, быстрее):
d4 = dict(d1)
d4.update(d2)
d4.update(d3)
Предыдущая SO вопрос, что оба эти ответы пришли в here.
Вы можете использовать метод update()
построить новый словарь, содержащий все элементы:
dall = {}
dall.update(d1)
dall.update(d2)
dall.update(d3)
Или, в цикле:
dall = {}
for d in [d1, d2, d3]:
dall.update(d)
обновление не создает новый словарь. Он (как и ожидалось) обновляет исходный. –
@ A.J.Rouvoet: «Оригинальный» в этом случае - совершенно новый пустой словарь в 'dall'. Этот новый словарь многократно обновляется, чтобы содержать все элементы. Это намеренно, что «dall» изменен. – sth
Ах, мой комментарий был исключительно на том, как вы сформулировали первое предложение. Он предположил, что это не так. Хотя я допускаю, что подавляющее большинство голосов было довольно резким. –
Slowest и не работает Python3: объединить 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
середнячок: петля 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
Or , один экземпляр-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, ** dict (d2, ** d3))' не быстрее, чем # 2, но это не так. –
1 выше лучше всего, если работать над маленькими диктофонами, поскольку яснее, на мой взгляд. – Baz
Просто наткнулся на эту тему, и я постоянно получаю ~ 0,2 мкс быстрее результатов, используя 'd4 = d1.copy(); d4.update (d2, ** d3) ', чем' d4 = dict (d1, ** d2); d4.update (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))
Я немного опоздал на эту вечеринку, я знаю, но я h Это помогает кому-то.
' import' * do * count. но решение здесь по-прежнему интересно – javadba
для python 3.6 оно должно быть 'd.items()' вместо 'd.iteritems()'. спасибо за ваш вклад! –
Используйте конструктор ДИКТ
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), {})
Вместо 'd4 = dict (d1) 'можно использовать' d4 = copy (d1) '. –
@ds: Это похоже на то, что не работает. Возможно, вы имели в виду 'копировать копию копии; d4 = copy (d1) 'или, возможно,' d4 = d1.copy() '. –
Первая версия не работает на Python3. – Superbest