문제

비 integer 값으로 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__ 기타,하지만 아직 해결책을 찾지 못했습니다.

편집하다:

해결책은 다음과 같은 구현입니다.

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

그의 게시물에서 제안한대로. 하지만 항상 그렇듯이 모든 도로는 로마로 이어지지 만 필요하지 않기 때문에 이것이 최선의 해결책이라고 생각합니다. __add__ 내 수업에서

도움이 되었습니까?

해결책

약간 까다 롭습니다 - 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)

다른 팁

당신은 또한 그것을 구현해야 할 수도 있습니다 __radd__ "리버스 첨가"를 나타내는 함수는 "전방"방향으로 인수를 해결할 수없는 경우 호출됩니다. 예를 들어, x + y AS로 평가됩니다 x.__add__(y) 가능하면 존재하지 않으면 Python은 시도합니다. y.__radd__(x).

이후 sum() 함수는 정수로 시작합니다 0, 첫 번째 일은 다음과 같은 평가를 시도하는 것입니다.

0 + Foo(3)

이를 구현해야합니다 Foo.__radd__.

노력하다:

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

또는 아무것도 가져오고 싶지 않다면

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

또 다른 작은 장점은 반드시 __add__ 메소드 Foo Objects의 일부로, 이것이 당신이 추가하고 싶은 유일한 상황 인 경우. (그러나 아마도 정의하는 것은 아프지 않을 것입니다 __add__ 미래의 유연성을 위해.)

사용해보십시오 __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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top