В python3 метод items
больше не возвращает список , а скорее представление , которое действует как набор. В этом случае вам нужно взять объединение множеств, так как объединение с +
не будет работать:
dict(x.items() | y.items())
Для Python3-подобного поведения в версии 2.7 метод viewitems
должен работать вместо items
:
dict(x.viewitems() | y.viewitems())
Я предпочитаю эту запись в любом случае, поскольку кажется более естественным думать о ней как об операции объединения множеств, а не о конкатенации (как показывает заголовок).
Edit:
Еще пара моментов для Python 3. Во-первых, обратите внимание, что трюк dict(x, **y)
не будет работать в Python 3, если ключи в y
не являются строками.
Кроме того, Chainmap Раймонда Хеттингера answer довольно элегантно, поскольку может принимать в качестве аргументов произвольное количество диктов, но из документов похоже, что последовательно просматривает список из всех диктов для каждого поиска:
Поиск выполняет последовательный поиск соответствующих отображений, пока не будет найден ключ.
Это может замедлить вас, если в вашем приложении много поисков:
In [1]: from collections import ChainMap
In [2]: from string import ascii_uppercase as up, ascii_lowercase as lo; x = dict(zip(lo, up)); y = dict(zip(up, lo))
In [3]: chainmap_dict = ChainMap(y, x)
In [4]: union_dict = dict(x.items() | y.items())
In [5]: timeit for k in union_dict: union_dict[k]
100000 loops, best of 3: 2.15 µs per loop
In [6]: timeit for k in chainmap_dict: chainmap_dict[k]
10000 loops, best of 3: 27.1 µs per loop
Так что примерно на порядок медленнее для поисков. Я фанат Chainmap, но выглядит менее практичным там, где может быть много поисков.