【问题标题】:Aggregate elements of a list containing relativedelta objects聚合包含 relativedelta 对象的列表的元素
【发布时间】:2021-12-02 13:49:11
【问题描述】:

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

sum(myList)

但它给出了 TypeError。

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

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

代码:

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))

【问题讨论】:

  • 您的 relativedeltas 列表中似乎有一个整数,我们只能说没有可重现的示例
  • 您应该提供一个可重现的最小示例(即重现问题的小列表)
  • 你应该试试functools.reduce()
  • 我在问题中添加了代码。
  • @ScootCork 代码中没有整数。我更新了问题。请参阅代码部分以重现。

标签: python list relativedelta


【解决方案1】:

这是因为sum uses start value as 0.

>>> 帮助(总和) 关于内置模块内置函数 sum 的帮助: sum(iterable, /, start=0) 返回一个 'start' 值(默认值:0)加上一个可迭代的数字的总和 当可迭代对象为空时,返回起始值。 此函数专门用于数值,可能会拒绝非数字类型。

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

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

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

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

所以要解决这个问题,请使用一项(relativedelta 对象)作为start 参数,并将其他所有内容保留在可迭代对象中。

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.

【讨论】:

  • 很好看!
  • relativedate 对象是通过 for 循环添加的,我不想使用额外的变量来存储 rdelta1。在你的回答中,我必须在 for 循环之前做一些事情,比如 date1 = dates[0] 然后使用通常的 for 循环。
  • @ShaidaMuhammad 同意!,我的帖子解释了为什么 sum 在添加 relativedelta 对象时引发错误(如您的问题所述)以及如何摆脱它(使用 sum 本身),但这并不意味着它是 pythonic 解决方案:)。我还建议使用reduce 函数。
  • @AbduNIyas Gotcha
【解决方案2】:

使用减少

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))

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2019-02-20
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    相关资源
    最近更新 更多