Python "расширяется" для словаря

Каков наилучший способ расширить словарь с помощью другого? Например:

>>> a = { "a" : 1, "b" : 2 }
>>> b = { "c" : 3, "d" : 4 }
>>> a
{'a': 1, 'b': 2}
>>> b
{'c': 3, 'd': 4}

Я ищу любую операцию, чтобы избежать этого цикла for:

{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }

Я хочу сделать что-то вроде:

a.extend(b)  # This does not work

Ответ 2

Красивая драгоценность в этом закрытом вопросе:

"Путь oneliner", не изменяющий ни входных dicts,

basket = dict(basket_one, **basket_two)

Узнайте, что означает **basket_two (**).

В случае конфликта элементы из basket_two будут переопределять значения из basket_one. По мере того, как идут одни лайнеры, это довольно читаемо и прозрачно, и я не имею никакого отношения к тому, чтобы использовать его в любое время, когда нужно, чтобы смесь двух других пригодилась (любой читатель, у которого есть проблемы с пониманием, на самом деле будет очень хорошо обслуживаться как это побуждает его или ее к изучению формы dict и **;-). Так, например, используется как:

x = mungesomedict(dict(adict, **anotherdict))

являются достаточно частыми появлениями в моем коде.

Первоначально представлен Alex Martelli

Примечание. В Python 3 это будет работать, только если каждый ключ в basket_two равен string.

Ответ 3

a.update(b)

Будет добавлять ключи и значения из b в a, переписывая, если уже есть значение для ключа.

Ответ 4

Как уже упоминалось, a.update(b) для некоторых dicts a и b приведет к результату, который вы задали в своем вопросе. Тем не менее, я хочу отметить, что много раз я видел метод extend для отображения/установки объектов, желающих, чтобы в синтаксисе a.extend(b), a значения НЕ должны быть перезаписаны значениями b. a.update(b) перезаписывает значения a, и поэтому это не является хорошим выбором для extend.

Обратите внимание, что некоторые языки называют этот метод defaults или inject, поскольку его можно рассматривать как способ ввода значений b (которые могут быть набором значений по умолчанию) в словарь без перезаписи значений, которые могут уже существуют.

Конечно, вы могли бы просто заметить, что a.extend(b) почти совпадает с b.update(a); a=b. Чтобы удалить назначение, вы можете сделать это так:

def extend(a,b):
    """Create a new dictionary with a properties extended by b,
    without overwriting.

    >>> extend({'a':1,'b':2},{'b':3,'c':4})
    {'a': 1, 'c': 4, 'b': 2}
    """
    return dict(b,**a)

Благодаря Tom Leys для этой умной идеи, используя конструктор dict без побочных эффектов для extend.

Ответ 5

Вы пробовали использовать словарное понимание со словарным отображением:

c = {**a, **b}
# c = { "a" : 1, "b" : 2, "c" : 3, "d" : 4 }