所以我有这个清单:
[datetime.timedelta(0, 1800), datetime.timedelta(0, 1800), datetime.timedelta(0, 1800), datetime.timedelta(0, 1800)]
总计是凌晨2点。我正在尝试将这些添加到2:00时间增量,然后需要将其转换为2.0小时的字符串。作为最后的倒计时,1:30小时将是1.5小时。
答案 0 :(得分:3)
天真的方法是从每个对象中取seconds
并sum
>>> a = [datetime.timedelta(0, 1800)] * 4
>>> print sum([d.seconds for d in a])
7200
>>> print sum([d.seconds for d in a]) / 60.0 / 60.0
2.0
但这并不像Haidro的解决方案那么强大:
import operator
reduce(operator.add, a)
这会导致timedelta
对象具有正确的delta,您可以随意使用它。
答案 1 :(得分:3)
在Python中使用sum
函数加总任何类似数字和可添加的内容的显而易见的方法是:
>>> dts = [datetime.timedelta(0, 1800), datetime.timedelta(0, 1800), datetime.timedelta(0, 1800), datetime.timedelta(0, 1800)]
>>> sum(dts, start=datetime.timedelta(0))
datetime.timedelta(0, 9, 933279)
(对于大多数类似的类型,您甚至不需要start
值,因为他们知道如何将自己添加到0
。timedelta
显然不允许这样做,避免意外混合无量纲区间 - 例如,您不希望将timeout_in_millis
添加到timedelta
...)
每当您将reduce
与operator.add
用于类似数字的值时,您可能做错了。
如果您没有向initial
提供reduce
参数,则使用空列表会出错,引发TypeError
而不是返回0
值。 (没有数字的总和是0;没有timedelta
的总和是timedelta(0)
;等等。)
如果你确实提供了一个initial
参数,那么它只是一个更冗长,更复杂,更慢的方式来编写sum
。比较:
functools.reduce(operator.add, a, foo(0))
sum(a, foo(0))