Допустим, у меня есть три разных словаря:
dictA = {'A': 1, 'B': 2, 'C': 3}
dictB = {'C': 1, 'D': 2, 'E': 3}
dictC = {'A': 2, 'C': 4, 'E': 6, 'G': 8}
И я хочу «сложить» эти словари вместе в порядке dictA+dictB+dictC
. Я имею в виду следующее:
значения с одинаковыми ключами будут добавлены вместе (например, 'A': 1
в dictA и 'A': 2
в dictB в конце станут 'A': 3
)
будут созданы значения без ранее существовавшего ключа (например, во время dictB + dictC
ключ 'G'
не существует, поэтому он будет создан)
Результат для этого примера должен выглядеть примерно так:
resultDict = {'A': 3, 'B': 2, 'C': 8, 'D': 2, 'E': 9, 'G': 2,}
Есть простой способ сделать это? Словари, с которыми я на самом деле работаю, намного больше и вложены в несколько других словарей, поэтому извините, если этот пример не совсем объясняет. Я пробовал возиться с циклами for, но, как я уже упоминал, списки, с которыми я на самом деле работаю, намного больше, и с ними не так легко работать.
Я бы определил пустой словарь result
, затем перебрал все ключи всех входных словарей и добавил их значения к соответствующему ключу в result
. ИМХО, это легко. Что для вас означает слово «легко»?
Переберите ключи в словаре B. Если этот ключ существует в словаре A, добавьте значение B к ключу A, в противном случае создайте новый ключ в словаре A. В чем здесь реальная трудность?
Можете ли вы привести пример ожидаемого результата, если у вас есть вложенный словарь?
Самый простой способ использовать показанный вами формат — собрать все ключи, затем .get()
каждый ключ со значением по умолчанию 0 и добавить в новый словарь.
Вот базовая структура, которая показывает это в действии:
dictA = {'A': 1, 'B': 2, 'C': 3}
dictB = {'C': 1, 'D': 2, 'E': 3}
dictC = {'A': 2, 'C': 4, 'E': 6, 'G': 8}
dict_list = [dictA, dictB, dictC]
# Collect all the keys from each dict
all_keys = set()
for dictx in dict_list:
all_keys.update(dictx.keys())
# Iterate through each key adding it to the result
resultDict = {}
for key in all_keys:
# Pre-init with a 0 then grab it or default to 0 from each dict
resultDict[key] = 0
for dictx in dict_list:
resultDict[key] += dictx.get(key, 0)
print(resultDict)
Вот пример кода, сжатый до однострочника:
resultDict = {key: sum([x.get(key, 0) for x in dict_list]) for key in set().union(*(d.keys() for d in dict_list))}
В основном вдохновлен этим ответом.
Дайте знать, если у вас появятся вопросы.
Счетчик коллекций делает это очень просто, поскольку вы можете складывать объекты Counter вместе. Другими словами, это делает то, что вы хотите:
Counter(dictA) + Counter(dictB) + Counter(dictC)
Если вы хотите обобщить, вы можете использовать sum()
и указать пустой счетчик для начального параметра, поэтому сделайте очень кратким:
from collections import Counter
dictA = {'A': 1, 'B': 2, 'C': 3}
dictB = {'C': 1, 'D': 2, 'E': 3}
dictC = {'A': 2, 'C': 4, 'E': 6, 'G': 8}
dicts = [dictA, dictB, dictC]
counts = sum(map(Counter, dicts), Counter())
# Counter({'E': 9, 'C': 8, 'G': 8, 'A': 3, 'B': 2, 'D': 2})
Объект-счетчик действует так же, как словарь, но если вам нужен именно словарь, вы можете просто использовать dict(counts)
.
Определенно читабельнее, чем мой, проголосовал за.
Сработало как часы, большое спасибо!
Звучит так, как будто ты хочешь
collections.Counter