Например, у меня есть два слова:
Dict A: {'a': 1, 'b': 2, 'c': 3}
Dict B: {'b': 3, 'c': 4, 'd': 5}
Мне нужен питонный способ «комбинирования» двух диктов, так что результат будет таким:
{'a': 1, 'b': 5, 'c': 7, 'd': 5}
То есть: если ключ появляется в обоих диктовках, добавьте их значения, если он появляется только в одном диктовке, сохраните его значение.
python
dictionary
Деррик Чжан
источник
источник
sum(counters)
не работает, к сожалению.sum()
начальную стоимость, сsum(counters, Counter())
.+=
суммировать на месте.res = counters[0]
тогдаfor c in counters[1:]: res += c
.update()
вместо+=
:for c in counters[1:]: res.update(c)
.Более общее решение, которое работает и для нечисловых значений:
или даже более общий:
Например:
источник
for k in b.viewkeys() & a.viewkeys()
при использовании Python 2.7 и пропустить создание наборов.set(a)
возвращает набор ключей, а не набор кортежей? В чем причина этого?list({..})
иfor k in {...}
т. д.operator.mul
понять, что этот код является общим и не ограничивается добавлением чисел.{**a, **b, **{k: op(a[k], b[k]) for k in a.keys() & b}}
должен работать в Python 3.5+.источник
for x in set(itertools.chain(A, B))
будет ли использование более логичным? Поскольку использование set on dict - это чушь, поскольку ключи уже уникальны? Я знаю, что это просто еще один способ получить набор ключей, но я нахожу это более запутанным, чем использованиеitertools.chain
(подразумевая, что вы знаете, чтоitertools.chain
делает)Введение: Есть (возможно) лучшие решения. Но вы должны знать это и помнить об этом, и иногда вы должны надеяться, что ваша версия Python не слишком старая или какая-то проблема может быть.
Тогда есть самые «хакерские» решения. Они велики и коротки, но иногда их трудно понять, прочитать и запомнить.
Есть, однако, альтернатива, которая заключается в том, чтобы попытаться заново изобрести колесо. - Зачем изобретать велосипед? - Как правило, потому что это действительно хороший способ обучения (а иногда просто потому, что уже существующий инструмент делает не совсем то, что вы хотите и / или так, как вы хотели бы), и самый простой способ, если вы не знаете или не помню идеальный инструмент для вашей проблемы.
Итак , я предлагаю заново изобрести колесо
Counter
класса изcollections
модуля (хотя бы частично):Возможно, есть другой способ реализовать это, и уже есть инструменты для этого, но всегда приятно представить, как все будет работать в принципе.
источник
источник
Тот, без дополнительного импорта!
Это питонный стандарт, называемый EAFP (Прощение проще, чем разрешения). Код ниже основан на этом стандарте Python .
РЕДАКТИРОВАТЬ: спасибо Jerzyk за его предложения по улучшению.
источник
Определенное суммирование
Counter()
s - самый питонический путь в таких случаях, но только если это приводит к положительному значению . Вот пример, и, как вы можете видеть,c
результата нет после отрицанияc
значения вB
словаре.Это потому, что
Counter
s были в первую очередь предназначены для работы с положительными целыми числами для представления счетчиков (отрицательный счет не имеет смысла). Но чтобы помочь с этими вариантами использования, python документирует минимальный диапазон и ограничения типа следующим образом:Таким образом, чтобы обойти эту проблему после суммирования вашего счетчика, вы можете использовать
Counter.update
для получения желаемого результата. Это работает как,dict.update()
но добавляет счет вместо того, чтобы заменить их.источник
ИЛИ
В качестве альтернативы вы можете использовать Counter, как упомянул выше @Martijn.
источник
Для более общего и расширяемого способа проверьте mergedict . Он использует
singledispatch
и может объединять значения на основе своих типов.Пример:
источник
С python 3.5: слияние и суммирование
Благодаря @tokeinizer_fsj, который сказал мне в комментарии, что я не совсем понял значение вопроса (я подумал, что добавление означало просто добавление ключей, которые в конечном итоге сильно различаются в двух словарях, и вместо этого я имел в виду, что значения общих ключей следует суммировать). Поэтому я добавил этот цикл перед объединением, чтобы второй словарь содержал сумму общих ключей. Последний словарь будет тем, значения которого будут сохраняться в новом словаре, который является результатом слияния двух, так что я думаю, что проблема решена. Решение действительно с Python 3.5 и последующих версий.
Многоразовый код
источник
b
-5
(2 + 3), но ваш метод возвращается3
.Кроме того, обратите внимание,
a.update( b )
что в 2 раза быстрее, чемa + b
источник
Вы можете легко обобщить это:
Тогда это может занять любое количество диктов.
источник
Это простое решение для объединения двух словарей, где
+=
можно применить к значениям, оно должно перебирать словарь только один разисточник
Это решение простое в использовании, оно используется как обычный словарь, но вы можете использовать функцию суммы.
источник
Что о:
Вывод:
источник
Вышеуказанные решения отлично подходят для сценария, где у вас есть небольшое количество
Counter
s. Если у вас есть большой список из них, что-то вроде этого гораздо приятнее:Вышеупомянутое решение по существу суммирует
Counter
с помощью:Это делает то же самое, но я думаю, что это всегда помогает увидеть, что он делает под ним.
источник
Объединение трех диктов a, b, c в одну строку без каких-либо других модулей или библиотек
Если у нас есть три дикта
Объединить все в одну строку и вернуть объект dict, используя
возврате
источник
{'a': 9, 'b': 9, 'd': 90}
. Вы пропустите требование "сумма".