我一直在尝试尝试让这个工作,我已经筋疲力尽了每一个想法和网络搜索。似乎没有什么可以做到的。我需要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
结果是:
1
,3
,6
我理解它这样做是因为它遍历for循环。我没有得到的是如何在不使用循环的情况下获得每个列表值?还是有某种方法被忽视了?
要明确我只想要返回的最终号码,例如6
编辑我忽略了一个巨大的因素,列表中的项目是timedealta对象,所以我必须使用.seconds
使它们成为整数才能添加。下面的解决方案是有道理的,我尝试过类似但尝试在sum语句中抛出.seconds
转换会引发错误。
d = { key : [timedelta_Obj1,timedelta_Obj2,timedelta_Obj3] }
答案 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