在defaultdict(list)中求和数字
我一直在尝试让这个问题解决,但我已经用尽了所有的想法和网上搜索的结果。似乎没有什么能奏效。我需要对一个 defaultdict(list)
中的数字进行 sum
操作,我只想要最终的结果,但无论我怎么做,我只能通过循环来得到所有的和,最后再加起来。一般来说,我尝试的是这样的:
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
结果是:
1
,3
,6
我明白这是因为它在循环中逐个处理。我不明白的是,除了使用循环,还有什么方法可以获取这些列表中的每个值?或者我有没有忽略什么方法?
为了明确,我只想要最终的数字,比如 6
编辑 我忽略了一个重要因素,列表中的项目是 timedelta 对象,所以我必须使用 .seconds
将它们转换为整数以便进行相加。下面的解决方案是有道理的,我也尝试过类似的方法,但在 sum 语句中加入 .seconds
转换时却出现了错误。
d = { key : [timedelta_Obj1,timedelta_Obj2,timedelta_Obj3] }
5 个回答
0
如果你不想一个一个地处理或者使用列表推导式,你可以用这个方法:
d = {'1': [1, 2, 3], '2': [3, 4, 5], '3': [5], '4': [6, 7]}
print(sum(map(sum, d.values())))
如果你在用Python 2,并且你的字典里有很多键,最好使用imap
(来自itertools
)和itervalues
。
from itertools import imap
print sum(imap(sum, d.itervalues()))
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
0
你可以先把字典里每个列表的数字加起来,然后再把这些结果再加一次,得到最终的总和。
>>> 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
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())
1
我觉得这个对你会有帮助:
sum(td.seconds for sublist in d.itervalues() for td in sublist)