7

Python: Как использовать "extend" для словаря?

1

Какой лучший способ объединить два словаря в один, избегая при этом использования цикла for? Например:

a = { "a" : 1, "b" : 2 }
b = { "c" : 3, "d" : 4 }
print(a)  # {'a': 1, 'b': 2}
print(b)  # {'c': 3, 'd': 4}

Результат должен выглядеть так:

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

Что-то вроде:

a.extend(b)  # Это не работает

Как можно решить эту задачу?

2 ответ(ов)

0

Команда a.update(b) добавит ключи и значения из словаря b в словарь a, перезаписывая значения, если для какого-либо ключа уже существует значение в a.

0

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

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

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

def extend(a, b):
    """Создать новый словарь с свойствами a, расширенными значениями из b,
    без перезаписи.

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

Спасибо Тому Лейсу за эту умную идею использовать конструктор dict без побочных эффектов для extend.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь