Значения суммы словаря Python - PullRequest
0 голосов
/ 14 июля 2011

Я использую Python 2.7, и у меня есть большой словарь, который выглядит примерно так

{J: [92704, 238476902378, 32490872394, 234798327, 2390470], M: [32974097, 237407, 3248707, 32847987, 34879], Z: [8237, 328947, 239487, 234, 182673]}

Как я могу суммировать их по значению, чтобы создать новый словарь, который суммирует первые значения в каждом словаре, затем второе и т. Д. Как

{FirstValues: J[0]+M[0]+Z[0]}

и т.д.

Ответы [ 5 ]

3 голосов
/ 14 июля 2011
In [4]: {'FirstValues': sum(e[0] for e in d.itervalues())}
Out[4]: {'FirstValues': 33075038}

, где d - ваш словарь.

1 голос
/ 14 июля 2011

Я не знаю, зачем вам нужен словарь в качестве вывода, но вот он:

dict(enumerate( [sum(x) for x in zip(*d.values())] ))
1 голос
/ 14 июля 2011
from itertools import izip_longest
totals = (sum(vals) for vals in izip_longest(*mydict.itervalues(), fillvalue=0))
print tuple(totals)

На английском языке ...

  1. объединить списки (значения dict) вместе, добавив 0 (если вы хотите, вам не нужно).
  2. Суммируйте каждую заархивированную группу

Например,

mydict = {
    'J': [1, 2, 3, 4, 5], 
    'M': [1, 2, 3, 4, 5], 
    'Z': [1, 2, 3, 4]
}
## When zipped becomes...
([1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4], [5, 5, 0])
## When summed becomes...
(3, 6, 9, 12, 10)

Не имеет смысла создавать новый словарь, поскольку новые ключи (вероятно) бессмысленны.Результаты не относятся к исходным ключам.Более подходящим является кортеж, так как results[0] содержит сумму всех значений в позиции 0 в исходных значениях dict и т. Д.

Если вы должны иметь dict, возьмите итератор totalsи превратить его в диктовку так:

new_dict = dict(('Values%d' % idx, val) for idx, val in enumerate(totals))
1 голос
/ 14 июля 2011
print [sum(row) for row in zip(*yourdict.values())]

yourdict.values() получает все списки, zip(* ) группирует первый, второй и т. Д. Элементы вместе и sum суммирует каждую группу.

0 голосов
/ 14 июля 2011

Скажем, у вас есть какой-то голос, подобный:

d = {'J': [92704, 238476902378, 32490872394, 234798327, 2390470], 
     'M': [32974097, 237407, 3248707, 32847987, 34879], 
     'Z': [8237, 328947, 239487, 234, 182673]}

Создайте defaultdict (int)

from collections import defaultdict
sum_by_index = defaultdict(int)
for alist in d.values():
    for index,num in enumerate(alist): 
        sum_by_index[index] += num
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...