Суммирование определенных элементов во вложенном dict - PullRequest
0 голосов
/ 28 января 2019

У меня есть 3 разных пакета, которые я представляю, используя вложенный словарь.Их ключи - «bag1», «bag2» и «bag3» и, в свою очередь, содержат разноцветные шарики разного количества, каждая цветовая категория также представлена ​​словарем.Как получить словарь, который просто добавляет все соответствующие цвета в каждую сумку?Например, dict1 = {'bag1': { 'red' : 2, 'blue' : 5, 'green' : 7}, 'bag2' : { 'red' : 3, 'blue': 4, 'green': 8}}.Теперь я хочу получить еще один, последний словарь в форме: dict2 = { 'red' : 5, 'blue': 9, 'green': 15}.Может ли кто-нибудь предоставить мне функцию для этого?

Ответы [ 4 ]

0 голосов
/ 28 января 2019

Использование list comprehensions для решения этой проблемы -

a=[ d.items() for d in list(dict1.values())]
my_tuples=[item for sublist in a for item in sublist]
my_set = {x[0] for x in my_tuples}
my_sums = dict([(i,sum(x[1] for x in my_tuples if x[0] == i)) for i in my_set])
print(my_sums)
    {'green': 15, 'red': 5, 'blue': 9}

Screenshot of the output

0 голосов
/ 28 января 2019

Вы можете использовать Счетчик из коллекции модуль:

from collections import Counter
dict1 = {'bag1': {'red': 2, 'blue': 5, 'green': 7}, 'bag2': {'red': 3, 'blue': 4, 'green': 8}}

counter = sum(map(Counter, dict1.values()), Counter())
print dict(counter)

Выход

{'blue': 9, 'green': 15, 'red': 5}
0 голосов
/ 28 января 2019

Ниже рекурсивной функции get_value найдет значение ключей из JSON.

import json

def get_value(key, mydict):
    if key in mydict:
        return mydict[key]

    if type(mydict) is dict:
        for i in mydict:
            if type(i) is dict:
                return get_value(key, i)
    return 0

def get_sum(dict1, dict2):
    red, blue, green = 0, 0, 0
    red = get_value('red', dict1) + get_value('red', dict2)
    blue = get_value('blue', dict1) + get_value('blue', dict2)
    green = get_value('green', dict1) + get_value('green', dict2)
    return {
        'red':red,
        'blue': blue,
        'green':green
    }

if __name__=="__main__":
    dict1 = {'bag1': { 'red' : 2, 'blue' : 5, 'green' : 7}, 'bag2' : { 'red' : 3, 'blue': 4, 'green': 8}}
    dict2 = { 'red' : 5, 'blue': 9, 'green': 15}
    final_sum = get_sum(dict1, dict2)
    print(final_sum)

вывод: {'red': 5, 'blue': 9, 'green': 15}

0 голосов
/ 28 января 2019

Сначала вы хотите создать словарь результатов:

dict2 = {}
for key in dict1['bag1'].keys():
    dict2[key] = 0

, затем заполните его

for bag in dict1.values():
    for key, value in bag.items():
        dict2[key] += value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...