Как объединить два словаря на Python 2 и 3

  1. Слияние словарей на Python 2.7
  2. Python 3.5 (и выше) Метод объединения словарей
  3. Заключение по методам объединения

Предположим, у нас есть два словаря A и B, которые нужно объединить, где значения в B заменят эти значения в A, если они разделяют одну и ту же кнопку.

A = {'x': 10, 'y': 20}
B = {'y': 30, 'z': 40}

В объекте Python dictionary имеется инструментальный метод update() для обновления словаря A с B,

A.update(B)

Но данные A будут заменены на новые вместо того, чтобы возвращать новый словарь, содержащий слияние A и B.

Мы познакомим вас с методами объединения двух словарей и возврата нового словаря.

Слияние словарей на Python 2.7

Метод понимания словаря - 1

C = {key: value for d in (A, B) for key, value in d.items()}

d.itmes() возвращает список (key, value) пары в виде 2-х пар словаря d.

Этот метод использует вложенное понимание словаря для объединения двух словарей. Следует обратить особое внимание на правильный порядок for. Так и должно быть,

flattern_patterns = [planet
                    for sublist in planets
                    for planet in sublist]

Метод понимания словаря - 2

Мы также можем использовать метод dict() для инициализации нового словаря.

C = dict((key, value) for d in (A, B) for key, value in d.items())

Технически он почти такой же, как и вышеприведенный метод, но отличается производительностью, о которой будет сказано ниже.

itertools.chain Метод

Модуль itertools стандартизирует основной набор строительных блоков iterator. Он обладает такими характеристиками, как скорость и эффективность использования памяти.

itertools.chain возвращает объект цепи, чей метод .next() возвращает элементы из первого итерабельного, пока не будет исчерпан, затем из следующих итерабельных, пока не будут исчерпаны все.

dict(itertools.chain(A.iteritems(), B.iteritems()))

iteritems() возвращает итератор над (key, values) элементами словаря.

Таким образом, скрипты, описанные выше, вернут словарь, содержащий элементы A и B.

copy и update метод

Как упоминалось в начале, update() может слиться с A и B, но заменит словарь на месте. Мы могли бы использовать метод copy() для создания копии словаря A.

m = A.copy()
C = m.update(B)

Слияние методов анализа и сравнения производительности

import timeit

A = {'x': 10, 'y': 20}
B = {'y': 30, 'z': 40}

SETUP_CODE = '''
A = {'x': 10, 'y': 20}
B = {'y': 30, 'z': 40}
'''

TEST_CODE = '''
{key: value for d in (A, B) for key, value in d.items()}
'''
print min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000))

TEST_CODE = '''
dict((key, value) for d in (A, B) for key, value in d.items())
'''
print min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000))

TEST_CODE = '''
dict(itertools.chain(A.iteritems(), B.iteritems()))
'''
print min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000))

SETUP_CODE = '''
def merge_dicts(a, b):
    m = a.copy()
    m.update(b)
    return m

A = {'x': 10, 'y': 20}
B = {'y': 30, 'z': 40}
'''

TEST_CODE = '''
merge_dicts(A, B)
'''
print min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000))

В результате

0.0162378
0.029774
0.019975
0.0110059
Метод Производительность Рейтинг
{key: value for d in (A, B) for key, value in d.items()} 0.0162378 2
dict((key, value) for d in (A, B) for key, value in d.items()) 0.029774 4
dict(itertools.chain(A.iteritems(), B.iteritems()) 0.019975 3
merge_dicts(a, b) 0.0110059 1

Python 3.5 (и выше) Метод объединения словарей

На Python 3.5, кроме тех же методов, что и на Python 2.7, имеется также оператор ** распаковки dictionary, введённый в PEP-448. Он позволяет распаковывать произвольное количество элементов.

Внимание

d.iteritems() является устаревшим на Python 3. См. PEP-469.

>>> C = {**A, **B}
>>> C
{'x': 10, 'y': 30, 'z': 40}
import timeit

A = {'x': 10, 'y': 20}
B = {'y': 30, 'z': 40}

SETUP_CODE = '''
A = {'x': 10, 'y': 20}
B = {'y': 30, 'z': 40}
'''

TEST_CODE = '''
{**A, **B}
'''
print(min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000)))

TEST_CODE = '''
{key: value for d in (A, B) for key, value in d.items()}
'''
print(min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000)))

TEST_CODE = '''
dict((key, value) for d in (A, B) for key, value in d.items())
'''
print(min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000)))

TEST_CODE = '''
dict(itertools.chain(A.items(), B.items()))
'''
print(min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000)))

SETUP_CODE = '''
def merge_dicts(a, b):
    m = a.copy()
    m.update(b)
    return m

A = {'x': 10, 'y': 20}
B = {'y': 30, 'z': 40}
'''

TEST_CODE = '''
merge_dicts(A, B)
'''
print(min(timeit.repeat(setup = SETUP_CODE, stmt = TEST_CODE, repeat = 3, number=10000)))
0.0017047999999999508
0.009127499999999955
0.0168952
0.01078009999999996
0.005767999999999995
Метод Производительность Рейтинг
{**A, **B}} 0.0017047999999999508 1
{key: value for d in (A, B) for key, value in d.items()} 0.009127499999999955 3
dict((key, value) for d in (A, B) for key, value in d.items()) 0.0168952 5
dict(itertools.chain(A.items(), B.items()) 0.01078009999999996 4
merge_dicts(a, b) 0.005767999999999995 2

Заключение по методам объединения

В Python 2.7, copy и update является лучшим методом.

m = A.copy()
C = m.update(B)

На Python 3.5+ лучшим методом является распаковка словарей.

{**A, **B}

Сопутствующая статья - Python dictionary

  • Как проверить наличие ключа в словаре на Python языке
  • Как сортировать Pythonский словарь по значению
  • Как удалить элемент из словаря Pythonа
  • Как получить ключи от словаря в виде списка на Python
  • comments powered by Disqus