<div dir="ltr">2013/9/18 Riccardo Lemmi <span dir="ltr"><<a href="mailto:riccardo@reflab.com" target="_blank">riccardo@reflab.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 class="im"><br></div><div><div class="h5">
<br>
</div></div>Mi sfugge il caso, forse un esempio chiarirebbe... L'unico posto in cui<br>
vedo male il codice messo sopra è quello in cui si usano gli elementi<br>
dell'array non in sequenza ma pescando in "qua e la'"<br>
<span class=""><font color="#888888"><br></font></span></blockquote><div><br></div><div>Ho visto la luce.</div><div><br></div><div>Questo e' il codice che ha causato il thread (semplificato, ovviamente);</div><div><br>
</div><div><div>def evaluate(list):</div><div>    return sum(v for v in list if v % 2 == 0)</div><div><br></div><div>def _subtract(list1, list2):</div><div>    result = list1[:]</div><div>    for val in list2:</div><div>        result.remove(val)</div>
<div>    return result</div><div><br></div><div>def useless(list):</div><div>    useful = list[:]</div><div>    for val in list:</div><div>        useful.remove(val)</div><div>        if evaluate(useful) != evaluate(list):</div>
<div>            useful.append(val)</div><div>    return _subtract(list, useful)</div><div><br></div><div>if __name__ == "__main__":</div><div>    print(useless([]))    # => []</div><div>    print(useless([1, 2, 3, 5, 8]))    # => [1, 3, 5]</div>
</div><div><br></div><div>Codice abbastanza orrido, no?</div><div><br></div><div>L'idea e' calcolare gli elementi di una lista che non contribuiscono al valore determinato da una certa funzione. Diciamo che evaluate in realta' e' molto piu' complessa (non computazionalmente, ma matematicamente non e' semplice), che e' insensibile all'ordine degli elementi nella lista (da cui l'uso di remove non posizionale) e che ovviamente questo codice non e' ottimizzato (eg: e' inutile chiamare evaluate(list) ogni volta nel ciclo).</div>
<div><br></div><div>L'ho riscritto senza copy.copy ma con [:] e ovviamente tutto bene, ma non e' un gran guadagno. Poi ho provato a fare una comprehension che fa tutto al volo e mi e' venuta al primo colpo:</div>
<div><br></div><div><div>def useless(list):</div><div>    return [list[i] for i in range(len(list)) if evaluate(list[:i] + list[i+1:]) == evaluate(list)]</div></div><div><br></div><div>Oserei dire che e' persino un pelo piu' comunicativa cosi', visto che non devo calcolare una lista e poi sottrarla all'altra.</div>
<div><br></div><div>Mi sento come se avessi trovato il barattolo di nutella di Moretti, un cucchiaione e nessuno attorno...  :)</div><div><br></div><div>Ciao</div><div>Giuliano</div><div><br></div><div>PS: queste sono le cose che fanno scattare l'ammmmore...</div>
</div><br clear="all"><div><br></div>-- <br>Piergiuliano Bossi<br>Blog: <a href="http://thinkingbox.wordpress.com/" target="_blank">http://thinkingbox.wordpress.com/</a><br>Twitter: <a href="http://twitter.com/thinkingbox" target="_blank">http://twitter.com/thinkingbox</a> (English)<br>
Twitter: <a href="http://twitter.com/scatolapensante" target="_blank">http://twitter.com/scatolapensante</a> (Italiano)<br><div>Google+: <a href="https://plus.google.com/u/0/108187981162465525118" target="_blank">https://plus.google.com/u/0/108187981162465525118</a></div>

</div></div>