所以我有这个清单:
[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…)
每当您将reducewithoperator.add用于类似数字的值时,您可能做错了。
如果您不向 提供initial参数reduce,它将对空列表执行错误的操作,从而引发 aTypeError而不是返回0值。(没有数字的和是 0;没有timedeltas 的和是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具有正确增量的对象,您可以随意使用它。