2009-08-02 3 views
23

Есть ли простой и быстрый способ использования sum() с нецелыми значениями?python 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:

The раствор должен быть реализован:

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

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

ответ

25

Его немного сложнее - сумма() функция принимает старт и добавляет его к следующему и так далее

Вы должны реализовать __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) 
+0

Я думаю, что просто реализация __radd__ - лучшее решение, так как ему не нужны map(), reduce() или импорт дополнительных модулей. – sloth

5

Try:

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

сумма() работает, вероятно, быстрее, но это специализируется только на встроенных номерах. Конечно, вы все равно должны предоставить метод для добавления ваших объектов 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 
+0

из functools импорта уменьшить # PY3 –

+0

Это наиболее общее решение, которое работает для любого типа, реализующего '__add__', включая те, которые не предназначены для работы с' sum (...) ', такие как количества с единицами в библиотеке' pint'. – gerrit

3

Попробуйте использовать метод __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) 
5

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

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

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

16

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

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

0 + Foo(3) 

, который будет требовать, чтобы вы реализуете Foo.__radd__.

Смежные вопросы