<div dir="ltr">2013/9/27 Piergiuliano Bossi <span dir="ltr"><<a href="mailto:pgbossi@gmail.com" target="_blank">pgbossi@gmail.com</a>></span><br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr"><div>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?</div><div><br></div><div>Diciamo che ogni oggetto nella collezione _values implementa un metodo func() che ritorna un valore confrontabile.</div>
<div><br></div><div>V1</div><div> def _max_value(self):</div><div> max_value = self._values[0]<span style="white-space:pre-wrap"> </span># facciamo finta che la la collezione e' per definizione non vuota e ogni valore e' significativo</div>
<div> for i in range(1, len(self._values)): </div><div> if self._values[i].func() > max_values.func():</div><div> max_value = self._values[i]</div><div>
return max_value</div></div></blockquote><div><br></div><div>Questo non è pythonico (e c'è un errore max_value.func() senza "s").</div><div><br>Meglio:</div><div><br></div><div><div> def _max_value(self):</div>
<div> max_value = self._values[0]</div><div> for value in self._values:</div><div> if value.func() > max_value.func():</div><div> max_value = value</div><div> return max_value</div>
</div><div><br></div><div>Comunque mi auguro che func() non sia pesante computazionalmente perché lo ricalcoli ogni volta per max_value.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr"><div>Questa versione funziona, ma il codice fa francamente un po' schifo e la prossima volta che ho un problema simile dovro' riscrivere tutto.</div><div><br></div><div>
V2</div><div> def value_at_max(values, functor):</div><div> max_value = None<span style="white-space:pre-wrap"> </span># si usano trucchetti come questo con None o ci sono modi migliori?</div><div> for value in values:</div>
<div> if not max_value or functor(value) > functor(max_value):</div><div> max_value = value</div><div> return max_value</div><div><br></div><div> def _max_value(self):</div><div> return value_at_max(self._values, lambda v: v.func())</div>
<div> </div><div>V2 mi sembra meglio, riutilizzero' value_at_max in altri posti.</div></div></blockquote><div><br></div><div>Io userei questo:</div><div><br></div><div>V3</div><div> max_value = values[max((value.func(), i) for i, value in enumerate(values))[1]]<br>
</div><div><br></div><div>Se lo vuoi un po' più leggibile:</div><div><br></div><div>V3b</div><div><div> max_value_value, index = max((value.func(), i) for i, value in enumerate(values))<br></div></div><div> max_value = values[index]<br>
</div><div><br></div><div>Ciao.</div><div>Marco.</div><div><br></div></div>-- <br><div><div><div><div><a href="http://beri.it/" target="_blank">http://beri.it/</a> - Un blog</div><div><a href="http://beri.it/i-miei-libri/" target="_blank">http://beri.it/i-miei-libri/</a> - Qualche libro</div>
<div><br></div></div></div></div>
</div></div>