包含relativedelta对象的列表的聚合元素

2024-10-02 16:25:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表myList,其中包含相对LTA对象。我想添加所有这些relativedeltas对象。 我试过:

sum(myList)

但它给出了类型错误

TypeError: unsupported operand type(s) for +: 'int' and 'relativedelta'

即使可以使用+Opeartor添加relativedelta对象

代码:

from datetime import datetime
from dateutil.relativedelta import relativedelta

date1 = datetime(2018, 4, 9).date()
date2 = datetime(2019, 8, 18).date()
date3 = datetime(2014, 2, 1).date()
date4 = datetime(2018, 12, 30).date()

myList = []

rdelta1 = relativedelta(date2, date1)
myList.append(rdelta1)


rdelta2 = relativedelta(date4, date3)
myList.append(rdelta2)

print(sum(myList))

Tags: 对象fromimportdatetimedatesumappendrelativedelta
2条回答

使用reduce

from datetime import datetime
from dateutil.relativedelta import relativedelta
from functools import reduce

date1 = datetime(2018, 4, 9).date()
date2 = datetime(2019, 8, 18).date()
date3 = datetime(2014, 2, 1).date()
date4 = datetime(2018, 12, 30).date()

myList = []

rdelta1 = relativedelta(date2, date1)
myList.append(rdelta1)


rdelta2 = relativedelta(date4, date3)
myList.append(rdelta2)

print(reduce(lambda x, y: x + y, myList))

这是因为^{} uses start value as ^{}.

>>> help(sum)
Help on built-in function sum in module builtins:

sum(iterable, /, start=0)
    Return the sum of a 'start' value (default: 0) plus an iterable of numbers

    When the iterable is empty, return the start value.
    This function is intended specifically for use with numeric values and may    reject non-numeric types.

例如,sum([1, 2])0 + 1 + 2

>>> sum([1, 2])
3

sum([1, 2], start=7)7 + 1 + 2

>>> sum([1, 2], start=7)
10

因此,要解决这个问题,请使用一个item(relativedelta对象)作为start参数,并将其他所有内容保留在iterable中

from datetime import datetime
from dateutil.relativedelta import relativedelta

date1 = datetime(2018, 4, 9).date()
date2 = datetime(2019, 8, 18).date()
date3 = datetime(2014, 2, 1).date()
date4 = datetime(2018, 12, 30).date()

myList = []

rdelta1 = relativedelta(date2, date1)

rdelta2 = relativedelta(date4, date3)
myList.append(rdelta2)

print(sum(myList, rdelta1)) # so both start and items in `MyList` are `relativedelta` types.

相关问题 更多 >