2013/9/27 Piergiuliano Bossi <pgbo...@gmail.com> > Ciao a tutti, un altro quesito della Susy: data una funzione e una > collezione, come fate a calcolare il valore in corrispondenza del quale la > funzione e' massimizzata? > > Diciamo che ogni oggetto nella collezione _values implementa un metodo > func() che ritorna un valore confrontabile. > > V1 > def _max_value(self): > max_value = self._values[0] # facciamo finta che la la collezione > e' per definizione non vuota e ogni valore e' significativo > for i in range(1, len(self._values)): > > if self._values[i].func() > max_values.func(): > max_value = self._values[i] > return max_value >
Questo non è pythonico (e c'è un errore max_value.func() senza "s"). Meglio: def _max_value(self): max_value = self._values[0] for value in self._values: if value.func() > max_value.func(): max_value = value return max_value Comunque mi auguro che func() non sia pesante computazionalmente perché lo ricalcoli ogni volta per max_value. Questa versione funziona, ma il codice fa francamente un po' schifo e la > prossima volta che ho un problema simile dovro' riscrivere tutto. > > V2 > def value_at_max(values, functor): > max_value = None # si usano trucchetti come questo con None o ci > sono modi migliori? > for value in values: > if not max_value or functor(value) > functor(max_value): > max_value = value > return max_value > > def _max_value(self): > return value_at_max(self._values, lambda v: v.func()) > > V2 mi sembra meglio, riutilizzero' value_at_max in altri posti. > Io userei questo: V3 max_value = values[max((value.func(), i) for i, value in enumerate(values))[1]] Se lo vuoi un po' più leggibile: V3b max_value_value, index = max((value.func(), i) for i, value in enumerate(values)) max_value = values[index] Ciao. Marco. -- http://beri.it/ - Un blog http://beri.it/i-miei-libri/ - Qualche libro
_______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python