Python: Как использовать "extend" для словаря?
Какой лучший способ объединить два словаря в один, избегая при этом использования цикла 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 ответ(ов)
Команда a.update(b)
добавит ключи и значения из словаря b в словарь a, перезаписывая значения, если для какого-либо ключа уже существует значение в a.
Как упомянули другие, 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
.
Преобразование списка словарей в DataFrame pandas
Почему использовать dict.get(key) вместо dict[key]?
Получить ключ по значению в словаре
Как преобразовать вложенный словарь Python в объект?
Ошибка: "'dict' объект не имеет метода 'iteritems'"