2010-05-28 29 views
8

Tôi có thể thực hiện tối đa (s) để tìm số tối đa của một chuỗi. Nhưng giả sử tôi muốn tính toán tối đa theo chức năng của riêng tôi, một cái gì đó như vậy -tìm tối đa trong trăn theo một số tiêu chí tùy chỉnh

currmax = 0 
def mymax(s) : 
    for i in s : 
    #assume arity() attribute is present 
    currmax = i.arity() if i.arity() > currmax else currmax 

Có cách nào làm sạch không?

Cảm ơn!

Trả lời

7

Bạn vẫn có thể sử dụng max chức năng:

max_arity = max(s, key=lambda i: i.arity()) 
+0

Thú vị, tôi không biết bạn có thể làm điều đó. – twneale

+0

Câu trả lời hay. Tuy nhiên, bất cứ lúc nào bạn sử dụng lambda, hãy nghĩ đến việc bạn phải làm gì. Nó gần như luôn luôn là pythonic để sử dụng một biểu thức máy phát điện như doublep làm ở trên. – fmark

10

Ví dụ,

max (i.arity() for i in s) 
+2

+1 vì điều này khớp với kết quả của mã trong OP –

23
max(s, key=operator.methodcaller('arity')) 

hoặc

max(s, key=lambda x: x.arity()) 
+3

Đây là tiêu đề của âm thanh như yêu cầu, nhưng mã được đăng tìm giá trị 'i.arity()', không phải giá trị 'i' –

+0

@ JohnLaRooy-AKAgnibbler: Tôi nghĩ bạn đã nói ngược lại, câu trả lời này trả về phần tử ('i') có giá trị tối đa gọi phương thức' arity() ', không phải giá trị đó là gì, những gì 'currmax' là trong mã của OP (và có lẽ là những gì họ đang cố gắng để xác định) - vì vậy tôi phải đồng ý rằng nó không trả lời câu hỏi. – martineau

2

Tôi nghĩ rằng sự biểu hiện sinh của doublep là tốt hơn, nhưng chúng tôi hiếm khi sử dụng m ethodcaller, do đó ...

from operator import methodcaller 
max(map(methodcaller('arity'), s)) 
Các vấn đề liên quan