Python Summe () und nicht-ganzzahlige Werte
Frage
Gibt es eine einfache und schnelle Möglichkeit Summe () zu verwenden, mit nicht-ganzzahligen Werten?
Also habe ich es wie folgt verwendet werden:
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
Ich habe versucht, zwingende __add__
und __int__
etc, aber ich habe keine Lösung noch
EDIT:
Die Lösung zu implementieren:
def __radd__(self, other):
return other + self.bar
als Will in seinem Posten vorgeschlagen. Aber wie immer, alle Wege führen nach Rom, aber ich denke, das ist die beste Lösung, da brauche ich nicht __add__
in meiner Klasse
Lösung
Es ist ein bisschen schwierig - die Summe () -Funktion nimmt den Start und fügt es in den nächsten und so weiter
Sie müssen die __radd__
Methode implementieren:
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)
Andere Tipps
Sie müssen möglicherweise auch die __radd__
Funktion implementieren, die „reverse add“ repräsentiert und wird aufgerufen, wenn die Argumente nicht in der „Vorwärts“ -Richtung gelöst werden. wenn möglich, wird beispielsweise x + y
als x.__add__(y)
ausgewertet, aber wenn das nicht vorhanden ist, dann versucht Python y.__radd__(x)
.
Da die sum()
Funktion mit der ganzen Zahl 0
beginnt, das erste, was sie tut, ist versuchen zu bewerten:
0 + Foo(3)
, die erfordert, dass Sie Foo.__radd__
implementieren.
Versuchen:
import operator
result=reduce(operator.add, mylist)
Summe () funktioniert wahrscheinlich schneller, aber es ist nur für builtin Zahlen spezialisiert. Natürlich müssen Sie noch eine Methode geben Sie Ihre Foo () Objekte hinzuzufügen. So voll Beispiel:
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
Oder wenn Sie nicht wollen, etwas importieren,
result = reduce((lambda x,y:x+y), mylist)
Ein weiterer kleiner Vorteil ist, dass man nicht unbedingt haben, um eine __add__
Methode als Teil Ihrer Foo Objekte zu erklären, wenn dies der einzige Umstand, passiert sein, in dem man sich wünschen kann zusätzlich zu tun. (Aber es wäre wahrscheinlich nicht schaden __add__
für zukünftige Flexibilität zu definieren.)
Versuchen Sie, die __int__
-Methode und dann Abbilden jedes Element in Ihrer Liste der int
Funktion, um die Werte raus:
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)