4

所以我有这个清单:

[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 小时作为最终倒计时。

4

2 回答 2

4

在 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_millistimedelta…)


每当您将reducewithoperator.add用于类似数字的值时,您可能做错了。

如果您不向 提供initial参数reduce,它将对空列表执行错误的操作,从而引发 aTypeError而不是返回0值。(没有数字的和是 0;没有timedeltas 的和是timedelta(0); 等等)

如果你确实提供了一个initial论点,那么它只是一种更冗长、更复杂、更慢的编写sum. 相比:

functools.reduce(operator.add, a, foo(0))
sum(a, foo(0))
于 2013-09-18T00:52:54.237 回答
4

天真的方法是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具有正确增量的对象,您可以随意使用它。

于 2013-09-17T22:26:42.150 回答