汇总defaultdict(列表)中的数字

时间:2014-08-13 21:58:33

标签: python python-2.7 sum iteration

我一直在尝试尝试让这个工作,我已经筋疲力尽了每一个想法和网络搜索。似乎没有什么可以做到的。我需要sum中的defaultdict(list)个数字,我只需要最终结果,但无论我做什么,我只能通过迭代并返回所有总和加到最终结果来获得最终结果。我一直在尝试的,

d = { key : [1,2,3] }
running_total = 0

#Iterate values
for value in d.itervalues:
  #iterate through list inside value
  for x in value:       
    running_total += x
    print running_total

结果是: 136 我理解它这样做是因为它遍历for循环。我没有得到的是如何在不使用循环的情况下获得每个列表值?还是有某种方法被忽视了?

要明确我只想要返回的最终号码,例如6

编辑我忽略了一个巨大的因素,列表中的项目是timedealta对象,所以我必须使用.seconds使它们成为整数才能添加。下面的解决方案是有道理的,我尝试过类似但尝试在sum语句中抛出.seconds转换会引发错误。

d = { key : [timedelta_Obj1,timedelta_Obj2,timedelta_Obj3] }

5 个答案:

答案 0 :(得分:1)

我认为这对你有用:

sum(td.seconds for sublist in d.itervalues() for td in sublist)

答案 1 :(得分:1)

尝试这种方法:

from datetime import timedelta as TD

d = {'foo' : [TD(seconds=1), TD(seconds=2), TD(seconds=3)],
     'bar' : [TD(seconds=4), TD(seconds=5), TD(seconds=6), TD(seconds=7)],
     'baz' : [TD(seconds=8)]}

print sum(sum(td.seconds for td in values) for values in d.itervalues())

答案 2 :(得分:0)

您可以只sum字典中的每个列表,然后获取返回列表的最后sum个。

>>> d = {'foo' : [1,2,3], 'bar' : [4,5,6,7], 'foobar' : [10]}

# sum each value in the dictionary
>>> [sum(d[i]) for i in d]
[10, 6, 22]

# sum each of the sums in the list
>>> sum([sum(d[i]) for i in d])
38

答案 3 :(得分:0)

如果您不想迭代或使用理解,可以使用:

d = {'1': [1, 2, 3], '2': [3, 4, 5], '3': [5], '4': [6, 7]}

print(sum(map(sum, d.values())))

如果您使用Python 2并且您的dict有很多键,那么您使用imap(来自itertools)和itervalues

会更好
from itertools import imap

print sum(imap(sum, d.itervalues())) 

答案 4 :(得分:0)

你的问题是如何获得价值"而不使用循环"。好吧,你不能。但是你可以做一件事:使用高性能itertools

如果您使用chain,则您的代码中不会有明确的循环。 chain为您管理。

>>> data = {'a': [1, 2, 3], 'b': [10, 20], 'c': [100]}
>>> import itertools
>>> sum(itertools.chain.from_iterable(data.itervalues()))
136

如果您有timedelta个对象,则可以使用相同的配方。

>>> data = {'a': [timedelta(minutes=1), 
                  timedelta(minutes=2), 
                  timedelta(minutes=3)], 
            'b': [timedelta(minutes=10), 
                  timedelta(minutes=20)], 
            'c': [timedelta(minutes=100)]}
>>> sum(td.seconds for td in itertools.chain.from_iterable(data.itervalues()))
8160