Python 's sum () 및 비 integer 값
문제
비 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)