所以我有这个清单:
[datetime.timedelta(0, 1800), datetime.timedelta(0, 1800), datetime.timedelta(0, 1800), datetime.timedelta(0, 1800)]
合起来就是 2:00 小时。我正在尝试将这些加起来以获得 2:00 时间增量,然后需要将其转换为 2.0 小时的字符串。1:30 小时将分别为 1.5 小时作为最终倒计时。
在 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
withoperator.add
用于类似数字的值时,您可能做错了。
如果您不向 提供initial
参数reduce
,它将对空列表执行错误的操作,从而引发 aTypeError
而不是返回0
值。(没有数字的和是 0;没有timedelta
s 的和是timedelta(0)
; 等等)
如果你确实提供了一个initial
论点,那么它只是一种更冗长、更复杂、更慢的编写sum
. 相比:
functools.reduce(operator.add, a, foo(0))
sum(a, foo(0))
天真的方法是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
具有正确增量的对象,您可以随意使用它。