[Python] calcolare il valore in corrispondenza del massimo

Marco Beri marcoberi a gmail.com
Ven 27 Set 2013 14:06:45 CEST


2013/9/27 Piergiuliano Bossi <pgbossi a 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
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20130927/0f72c0b3/attachment-0001.html>


Maggiori informazioni sulla lista Python