2009-08-02 50 views
23

Có cách nào đơn giản và nhanh chóng để sử dụng tổng() với các giá trị không nguyên?Giá trị sum() và số nguyên python

Vì vậy, tôi có thể sử dụng nó như thế này:

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 

Tôi đã cố gắng trọng __add____int__ vv, nhưng tôi không đã tìm thấy một giải pháp được nêu

EDIT:

Các giải pháp là triển khai:

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

như Will đề xuất trong bài đăng của anh ấy. Nhưng như mọi khi, tất cả các con đường đều dẫn đến Rome, nhưng tôi nghĩ rằng đây là giải pháp tốt nhất kể từ khi tôi không cần __add__ trong lớp học của tôi

Trả lời

25

của nó một chút khôn lanh - tổng() chức năng có bắt đầu và thêm nó vào hôm sau và vân vân

Bạn cần phải thực hiện các __radd__ phương pháp:

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

Tôi nghĩ rằng việc triển khai __radd__ là giải pháp tốt nhất, vì nó không cần map(), reduce() hoặc nhập các mô-đun bổ sung. – sloth

5

Hãy thử:

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

sum() hoạt động có thể nhanh hơn, nhưng nó chỉ dành riêng cho số nội trang. Tất nhiên bạn vẫn phải cung cấp một phương thức để thêm các đối tượng Foo() của bạn. Ví dụ đầy:

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

từ functools nhập khẩu giảm # Py3 –

+0

Đây là giải pháp chung nhất, hoạt động cho bất kỳ loại nào đang triển khai '__add__', bao gồm cả những loại không được thiết kế để làm việc với' tổng hợp (...) ', chẳng hạn như số lượng với các đơn vị trong thư viện' pint'. – gerrit

3

Hãy thử sử dụng phương pháp __int__ và sau đó lập bản đồ mỗi phần tử trong danh sách của mình vào int chức năng để có được các giá trị ra:

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

Hoặc nếu bạn không muốn nhập khẩu bất cứ điều gì,

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

một ưu điểm nhỏ là bạn không cần phải nhất thiết phải khai báo một thêm là một phần của đối tượng Foo của bạn, nếu điều này xảy ra là trường hợp duy nhất bạn muốn thực hiện thêm. (Tuy nhiên, nó có lẽ sẽ không làm tổn thương để xác định thêm sự linh hoạt trong tương lai.)

16

Bạn cũng có thể cần phải thực hiện các chức năng __radd__, đại diện cho "đảo ngược thêm" và được gọi là khi các đối số không thể được giải quyết trong hướng "chuyển tiếp". Ví dụ: x + y được đánh giá là x.__add__(y) nếu có thể, nhưng nếu điều đó không tồn tại thì Python sẽ thử y.__radd__(x).

Kể từ khi sum() chức năng bắt đầu với số nguyên 0, điều đầu tiên nó làm là cố gắng đánh giá:

0 + Foo(3) 

mà sẽ yêu cầu bạn thực hiện Foo.__radd__.

Các vấn đề liên quan