Re: [Python] calcolare il valore in corrispondenza del massimo
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? Primo gravissimo errore: la Susi ha la i normale. Troppo inglese ultimamente eh? :-D 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 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. Questa non ti piace? max_value = max(functor(value) for value in values) 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
Re: [Python] calcolare il valore in corrispondenza del massimo
2013/9/27 Marco Beri marcob...@gmail.com max_value = max(functor(value) for value in values) Ho riletto bene il tuo messaggio. Ho scritto una minchiata :-) Ora ci ripenso. 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
Re: [Python] calcolare il valore in corrispondenza del massimo
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
Re: [Python] calcolare il valore in corrispondenza del massimo
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 On 27/09/2013 13:26, Piergiuliano Bossi wrote: Perche' non usare invece una funzione libera che accetta un oggetto del tipo usato nella collezione? Se ti piace costruire a partire da blocchi principali, allora per prima cosa ci serve una funziona che restituisce il valore massimo in una sequenza e l'indice all'interno della sequenza che corrisponde a questo massimo. def max_idx(seq): # NOTE: this implementation do not support generators; # assume seq is not empty max = seq[0] max_idx = 0 for idx, value in enumerate(seq, start=1): if value max: max = value max_idx = idx # Return the index of the first occurrence of the max value return max, max_idx def max_value(seq, functor): # NOTE: do not support generators (really!) max, max_idx = max_idx(map(functor, seq)) return seq[max_idx] Non mi pronuncio sull'efficienza. Ciao Manlio -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.12 (GNU/Linux) Comment: Using GnuPG with Icedove - http://www.enigmail.net/ iEYEARECAAYFAlJFdM0ACgkQscQJ24LbaUSqJQCfe4w0D+hSSFtBjE/hweGKjYyS 8ZYAnAm+vQBvSdPHTsdjuTe3JhJcjNKH =28aH -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] calcolare il valore in corrispondenza del massimo
On Fri, Sep 27, 2013 at 2:06 PM, Manlio Perillo manlio.peri...@gmail.comwrote: Se ti piace costruire a partire da blocchi principali, allora per prima cosa ci serve una funziona che restituisce il valore massimo in una sequenza e l'indice all'interno della sequenza che corrisponde a questo massimo. Aha! Anche tu ci sei cascato. Mi sento sollevato... Non è quello che ha chiesto Giuliano. Lui vuole il valore per cui funzione(valore) è massimo. Non vuole l'indice, non vuole il massimo di valore, non vuole il massimo di funzione(valore). Ho capito bene, Giuliano? 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
Re: [Python] calcolare il valore in corrispondenza del massimo
Il giorno 27 settembre 2013 13:26, Piergiuliano Bossi pgbo...@gmail.comha scritto: 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()) Probabilmente non ho capito, ma non mi tornano un paio di cose: 1. se `functor = lambda v: v.func()` e `max_value = None` allora `functor(max_value) = None.func()`, che però non va bene. 2. V1 e V2 non mi sembrano avere lo stesso comportamento, perchè mentre V2 restituisce il primo `value` che è non falsy e per il quale vale `functor(value) functor(max_value)` (dato che la condizione si corto-circuita e non vengono effettuati altri confronti), invece V1 restituisce l'i-esimo elemento di `self._values` per il quale `self._values[i].func() restituisce il valore massimo. Mi sono perso qualcosa? ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] calcolare il valore in corrispondenza del massimo
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 On 27/09/2013 14:09, Marco Beri wrote: On Fri, Sep 27, 2013 at 2:06 PM, Manlio Perillo manlio.peri...@gmail.com mailto:manlio.peri...@gmail.com wrote: Se ti piace costruire a partire da blocchi principali, allora per prima cosa ci serve una funziona che restituisce il valore massimo in una sequenza e l'indice all'interno della sequenza che corrisponde a questo massimo. Aha! Anche tu ci sei cascato. Mi sento sollevato... Non │ quello che ha chiesto Giuliano. Lui vuole il valore per cui funzione(valore) │ massimo. E non e' quello che fa il mio codice? La prima funzione e' usata per trovare il massimo di funzione(valore) e l'indice corrispondente. La seconda funzione usa l'indice per trovare il valore per cui funzione(valore) e' massimo. [...] Ciao Manlio -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.12 (GNU/Linux) Comment: Using GnuPG with Icedove - http://www.enigmail.net/ iEYEARECAAYFAlJFeDgACgkQscQJ24LbaUQ9hwCgmIiI3I5J0+hJJfXS+XMO5kZR 7KUAmwXi3IWWGYtAUMTK6U/PM+mLWWQW =Ndil -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] calcolare il valore in corrispondenza del massimo
2013/9/27 Manlio Perillo manlio.peri...@gmail.com E non e' quello che fa il mio codice? La prima funzione e' usata per trovare il massimo di funzione(valore) e l'indice corrispondente. La seconda funzione usa l'indice per trovare il valore per cui funzione(valore) e' massimo. Hai ragione... non è giornata, mi ritiro a vita privata... :-) 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
Re: [Python] calcolare il valore in corrispondenza del massimo
2013/9/27 Manlio Perillo manlio.peri...@gmail.com On 27/09/2013 14:09, Marco Beri wrote: Aha! Anche tu ci sei cascato. Mi sento sollevato... Non │ quello che ha chiesto Giuliano. Lui vuole il valore per cui funzione(valore) │ massimo. E non e' quello che fa il mio codice? La prima funzione e' usata per trovare il massimo di funzione(valore) e l'indice corrispondente. La seconda funzione usa l'indice per trovare il valore per cui funzione(valore) e' massimo. scusate ma un: def _max_value(self): return max(self._values, key=lambda v: v.func()) no? Non dovrebbe risolvere? -- valerio ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] calcolare il valore in corrispondenza del massimo
2013/9/27 Valerio Maggio valerio.mag...@gmail.com def _max_value(self): return max(self._values, key=lambda v: v.func()) Eh, torna il valore calcolato e non quello originale... ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] calcolare il valore in corrispondenza del massimo
On Fri, Sep 27, 2013 at 2:27 PM, Marco Beri marcob...@gmail.com wrote: 2013/9/27 Valerio Maggio valerio.mag...@gmail.com def _max_value(self): return max(self._values, key=lambda v: v.func()) Eh, torna il valore calcolato e non quello originale... Mmm... per come l'ho capita io: l'obiettivo è avere il valore `v in values` tale che `functor(v)` assume valore massimo, right? In altre parole: target = v : v \in values \and functor(v) functor(v') \forall v' \in values, v' != v se è così: max(values, key=lambda v: functor(v)) ritorna il valore cercato, ergo v e non functor(v). Dove sbaglio? Se poi si cerca l'indice di v e non v, allora è un altro discorso. Su questo, però, esempio di codice originale (V1 e V2) e oggetto del messaggio sembrano non concordare :) -- valerio ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] calcolare il valore in corrispondenza del massimo
2013/9/27 Marco Beri marcob...@gmail.com 2013/9/27 Valerio Maggio valerio.mag...@gmail.com def _max_value(self): return max(self._values, key=lambda v: v.func()) Eh, torna il valore calcolato e non quello originale... In realtà torna l'originale: In [27]: class C(): def __init__(self, val): self.val = val def func(self): return self.val : In [28]: values = [C(x) for x in range(10)] In [29]: value = max(values, key=lambda v: v.func()) In [30]: value is values[-1] Out[30]: True In [31]: result = max(value.func() for value in values) In [32]: result is values[-1].func() Out[32]: True -- Nadir ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] calcolare il valore in corrispondenza del massimo
if not max_value or functor(value) functor(max_value): 2. V1 e V2 non mi sembrano avere lo stesso comportamento, perchè mentre V2 restituisce il primo `value` che è non falsy e per il quale vale `functor(value) functor(max_value)` (dato che la condizione si corto-circuita e non vengono effettuati altri confronti), invece V1 restituisce l'i-esimo elemento di `self._values` per il quale `self._values[i].func() restituisce il valore massimo. Mi sono perso qualcosa? Ok, scusate, mi ero perso il `not` in `if not max_value`. -- Nadir ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] calcolare il valore in corrispondenza del massimo
On Fri, Sep 27, 2013 at 2:40 PM, Nadir Sampaoli nadirsampa...@gmail.comwrote: 2013/9/27 Marco Beri marcob...@gmail.com 2013/9/27 Valerio Maggio valerio.mag...@gmail.com def _max_value(self): return max(self._values, key=lambda v: v.func()) Eh, torna il valore calcolato e non quello originale... In realtà torna l'originale: Hai ragione... non è giornata, mi ritiro a vita privata [cit] Tre cappelle in un unico thread sono a mio parere un record difficilmente superabile. 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
Re: [Python] calcolare il valore in corrispondenza del massimo
2013/9/27 Marco Beri marcob...@gmail.com 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? Primo gravissimo errore: la Susi ha la i normale. Troppo inglese ultimamente eh? :-D Suonava troppo autarchico con la i. :) Ciao Giuliano -- Piergiuliano Bossi Blog: http://thinkingbox.wordpress.com/ Twitter: http://twitter.com/thinkingbox (English) Twitter: http://twitter.com/scatolapensante (Italiano) Google+: https://plus.google.com/u/0/108187981162465525118 ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] calcolare il valore in corrispondenza del massimo
On Fri, Sep 27, 2013 at 8:06 AM, Manlio Perillo manlio.peri...@gmail.comwrote: -BEGIN PGP SIGNED MESSAGE- Hash: SHA1 On 27/09/2013 13:26, Piergiuliano Bossi wrote: Perche' non usare invece una funzione libera che accetta un oggetto del tipo usato nella collezione? Non sono sicuro di capire cosa intendi... Se ti piace costruire a partire da blocchi principali, Ehm, si', mi piace abbastanza, quando posso. A te? :) def max_idx(seq): [...] In effetti ritornare l'indice puo' essere piu' riutilizzabile. OTOH, e' un pelo meno leggibile IMHO. Comunque il tuo approccio e' alla fin fine filosoficamente equivalente al mio, o sbaglio? Grazie e ciao Giuliano -- Piergiuliano Bossi Blog: http://thinkingbox.wordpress.com/ Twitter: http://twitter.com/thinkingbox (English) Twitter: http://twitter.com/scatolapensante (Italiano) Google+: https://plus.google.com/u/0/108187981162465525118 ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] calcolare il valore in corrispondenza del massimo
2013/9/27 Marco Beri marcob...@gmail.com Tre cappelle in un unico thread sono a mio parere un record difficilmente superabile. (da pronuncia con forte accento germanico) SIETE TUTTI CATUTI IN MIA TRAPPOLA!! :) Ciao Giuliano -- Piergiuliano Bossi Blog: http://thinkingbox.wordpress.com/ Twitter: http://twitter.com/thinkingbox (English) Twitter: http://twitter.com/scatolapensante (Italiano) Google+: https://plus.google.com/u/0/108187981162465525118 ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] calcolare il valore in corrispondenza del massimo
On Fri, Sep 27, 2013 at 8:06 AM, Marco Beri marcob...@gmail.com wrote: 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). Bene, sono contento che anche secondo voi sia una fetecchia. Nello specifico, e' per via dell'iterazione sul range anziche' sui valori? 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 Tu saresti contento cosi' o andresti per V3? Comunque mi auguro che func() non sia pesante computazionalmente perché lo ricalcoli ogni volta per max_value. Si', giusta osservazione. Io userei questo: V3 max_value = values[max((value.func(), i) for i, value in enumerate(values))[1]] Questo mi piace ASSAI! :) Penso che lo wrappero' comunque in una funzioncina per ricordarmi cosa caspita fa. 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] Si', grazie. Ciao Giuliano -- Piergiuliano Bossi Blog: http://thinkingbox.wordpress.com/ Twitter: http://twitter.com/thinkingbox (English) Twitter: http://twitter.com/scatolapensante (Italiano) Google+: https://plus.google.com/u/0/108187981162465525118 ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] calcolare il valore in corrispondenza del massimo
2013/9/27 Valerio Maggio valerio.mag...@gmail.com Mmm... per come l'ho capita io: l'obiettivo è avere il valore `v in values` tale che `functor(v)` assume valore massimo, right? In altre parole: target = v : v \in values \and functor(v) functor(v') \forall v' \in values, v' != v se è così: max(values, key=lambda v: functor(v)) ritorna il valore cercato, ergo v e non functor(v). Dove sbaglio? Ma per giove, da nessuna parte: questo e' esattamente quello che volevo! :) Non avevo capito che key si puo' usare cosi' in max, Se poi si cerca l'indice di v e non v, allora è un altro discorso. No, io cercavo proprio v. Su questo, però, esempio di codice originale (V1 e V2) e oggetto del messaggio sembrano non concordare :) In che senso?!? Grazie mille. Ciao Giuliano -- Piergiuliano Bossi Blog: http://thinkingbox.wordpress.com/ Twitter: http://twitter.com/thinkingbox (English) Twitter: http://twitter.com/scatolapensante (Italiano) Google+: https://plus.google.com/u/0/108187981162465525118 ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] calcolare il valore in corrispondenza del massimo
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 On 27/09/2013 14:24, Valerio Maggio wrote: [...] scusate ma un: def _max_value(self): return max(self._values, key=lambda v: v.func()) no? Non dovrebbe risolvere? Va benissimo, direi! Ed │ molto pi elegante, generica (e probabilmente efficiente) della mia versione. Ciao Manlio -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.12 (GNU/Linux) Comment: Using GnuPG with Icedove - http://www.enigmail.net/ iEYEARECAAYFAlJFj+8ACgkQscQJ24LbaURrWwCeJDVlo1DB79NTMD7WEO2kOXkZ oTYAn2DE6CQ+WU9JoNDF9L8XTEM15bFL =ZoXN -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] calcolare il valore in corrispondenza del massimo
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 On 27/09/2013 14:22, Marco Beri wrote: 2013/9/27 Manlio Perillo manlio.peri...@gmail.com mailto:manlio.peri...@gmail.com E non e' quello che fa il mio codice? La prima funzione e' usata per trovare il massimo di funzione(valore) e l'indice corrispondente. La seconda funzione usa l'indice per trovare il valore per cui funzione(valore) e' massimo. Hai ragione... non │ giornata, mi ritiro a vita privata... :-) Comunque quel codice contiene un bug. Peccato che non ricevo le mail che invio in ml, non posso annotare l'errore. Ciao Manlio -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.12 (GNU/Linux) Comment: Using GnuPG with Icedove - http://www.enigmail.net/ iEYEARECAAYFAlJFju4ACgkQscQJ24LbaUSv/ACffbvXctQeHHwlIm3kXwwne/Kf ELgAn1EeQs2udTfNaY2NIXVCWBMjwSHI =tzd3 -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] calcolare il valore in corrispondenza del massimo
se è così: max(values, key=lambda v: functor(v)) ritorna il valore cercato, ergo v e non functor(v). Dove sbaglio? Ma per giove, da nessuna parte: questo e' esattamente quello che volevo! :) Non avevo capito che key si puo' usare cosi' in max, Se poi si cerca l'indice di v e non v, allora è un altro discorso. No, io cercavo proprio v. Mi sfugge qualcosa (o non ho capito cosa vuoi ottenere) Non basta scriverlo così? max(values,key=func) Walter ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python