2010-05-28 7 views
8

Ich kann max (s) tun, um das Maximum einer Sequenz zu finden. Aber ich nehme an, wie so max nach meiner eigenen Funktion, etwas berechnen will -Finden von Max in Python nach einem benutzerdefinierten Kriterium

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

Gibt es eine saubere pythonic Art und Weise, dies zu tun?

Danke!

Antwort

7

Sie können weiterhin die max Funktion:

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

Interessant, ich wusste nicht, dass Sie das tun könnten. – twneale

+0

Gute Antwort. Wenn Sie jedoch ein Lambda verwenden, denken Sie darüber nach, wenn Sie müssen. Es ist fast immer pythonischer, einen Generator-Ausdruck wie doublep oben zu verwenden. – fmark

10

Zum Beispiel

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

+1, da dies mit dem Ergebnis des Codes im OP übereinstimmt. –

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

oder

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

So klingt der Titel, wie er es verlangt, aber der angegebene Code findet den Wert von 'i.arity()', nicht den Wert von 'i' –

+0

@ JohnLaRooy-AKAgnibbler: Ich denke, dass Sie rückwärts gesagt haben, diese Antwort gibt das Element ('i') zurück, das den maximalen Wert des Aufrufs der' arity() '-Methode hatte, nicht was dieser Wert war, was nicht der Fall ist was "Currmax" ist in der OP-Code (und ist wahrscheinlich das, was sie versuchen zu bestimmen) - so würde ich zustimmen müssen, dass es die Frage nicht beantwortet. – martineau

2

I der Generator Ausdruck doublep denken ist besser, aber wir benutzen selten m ethodcaller, so ...

from operator import methodcaller 
max(map(methodcaller('arity'), s)) 
Verwandte Themen