在defaultdict(list)中求和数字

0 投票
5 回答
681 浏览
提问于 2025-04-18 17:13

我一直在尝试让这个问题解决,但我已经用尽了所有的想法和网上搜索的结果。似乎没有什么能奏效。我需要对一个 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)

撰写回答