сумма () и нецелые значения Python - PullRequest
24 голосов
/ 02 августа 2009

Есть ли простой и быстрый способ использовать 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

Я пытался переопределить __add__ и __int__ и т. Д., Но пока не нашел решения

EDIT:

Решение заключается в реализации:

 def __radd__(self, other):
    return other + self.bar

как предложил Уилл в своем посте. Но, как всегда, все дороги ведут в Рим, но я думаю, что это лучшее решение, поскольку мне не нужно __add__ в моем классе

Ответы [ 5 ]

27 голосов
/ 02 августа 2009

Немного сложно - функция 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)
19 голосов
/ 02 августа 2009

Вам также может понадобиться реализовать функцию __radd__, которая представляет «обратное добавление» и вызывается, когда аргументы не могут быть разрешены в «прямом» направлении. Например, x + y оценивается как x.__add__(y), если возможно, но если этого не существует, то Python пытается y.__radd__(x).

Поскольку функция sum() начинается с целого числа 0, первое, что она делает, это пытается оценить:

0 + Foo(3)

, что потребует от вас реализации Foo.__radd__.

5 голосов
/ 02 августа 2009

Или, если вы не хотите ничего импортировать,

result = reduce((lambda x,y:x+y), mylist)

Другим небольшим преимуществом является то, что вам не нужно обязательно объявлять метод __add__ как часть ваших объектов Foo, если это единственное обстоятельство, при котором вы хотите выполнить сложение. (Но, вероятно, не мешало бы определить __add__ для будущей гибкости.)

5 голосов
/ 02 августа 2009

Попробуйте:

import operator
result=reduce(operator.add, mylist)

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
3 голосов
/ 02 августа 2009

Попробуйте использовать метод __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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...