python的sum()和非整数值

slo*_*oth 25 python sum list

是否有一种简单快捷的方法将sum()与非整数值一起使用?

所以我可以像这样使用它:

class Foo(object):
    def __init__(self,bar)
        self.bar=bar

mylist=[Foo(3),Foo(34),Foo(63),200]
result=sum(mylist) # result should be 300
Run Code Online (Sandbox Code Playgroud)

我试着重写__add____int__等,但我没有找到一个解决办法

编辑:

解决方案是实现:

 def __radd__(self, other):
    return other + self.bar
Run Code Online (Sandbox Code Playgroud)

正如威尔在他的帖子中所说.但一如既往,所有道路都通往罗马,但我认为这是最好的解决方案,因为我不需要__add__在课堂上

Wil*_*ill 29

它有点棘手 - sum()函数开始并将其添加到下一个,依此类推

您需要实现该__radd__方法:

class T:
    def __init__(self,x):
        self.x = x
    def __radd__(self, other):
        return other + self.x

test = (T(1),T(2),T(3),200)
print sum(test)
Run Code Online (Sandbox Code Playgroud)

  • 如果想使用 int 以外的任何其他类型,可以使用 `sum(test, start=T(0))` 否则您将收到错误 `TypeError: unsupported operand type(s) for +: 'int' and ' str'` (4认同)

Gre*_*ill 19

您可能还需要实现该__radd__函数,该函数表示"反向添加",并且在无法在"向前"方向上解析参数时调用该函数.例如,x + y被评估为x.__add__(y)可能,但如果不存在则Python尝试y.__radd__(x).

由于sum()函数以整数开头0,它首先要做的是尝试评估:

0 + Foo(3)
Run Code Online (Sandbox Code Playgroud)

这将要求你实施Foo.__radd__.


lio*_*ori 6

尝试:

import operator
result=reduce(operator.add, mylist)
Run Code Online (Sandbox Code Playgroud)

sum()的工作速度可能更快,但它仅适用于内置数字.当然,您仍然需要提供一种方法来添加您的Foo()对象.如此完整的例子:

class Foo(object):
    def __init__(self, i): self.i = i
    def __add__(self, other):
        if isinstance(other, int):
            return Foo(self.i + other)
        return Foo(self.i + other.i)
    def __radd__(self, other):
        return self.__add__(other)

import operator
mylist = [Foo(42), Foo(36), Foo(12), 177, Foo(11)]
print reduce(operator.add, mylist).i
Run Code Online (Sandbox Code Playgroud)


And*_*are 6

尝试使用该__int__方法,然后将列表中的每个元素映射到int函数以获取值:

class Foo(object):
    def __init__(self,bar):
        self.bar = bar
    def __int__(self):
        return self.bar

mylist = [Foo(3),Foo(34),Foo(63),200]
result = sum(map(int,mylist))
print(result)
Run Code Online (Sandbox Code Playgroud)


Amb*_*ber 5

或者如果你不想进口任何东西,

result = reduce((lambda x,y:x+y), mylist)
Run Code Online (Sandbox Code Playgroud)

另一个小优点是,您不必将__add__方法声明为Foo对象的一部分,如果这恰好是您想要添加的唯一情况.(但定义__add__未来的灵活性可能不会有什么坏处.)