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

gefunden

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

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top