Re: [Python] liste in Python errore costruzione matrice
Ho fatto al momento la prima modifica e non viene più sollevata l' eccezione. Quindi dovrebbe andar bene. Ho però un altro dubbio: Quando eseguofor i in range(0, len(self.ArrChartData) - 1): se len(self.ArrChartData) è 0 voglio che il ciclo for non venga eseguito. se len(self.ArrChartData) è 1 voglio che il ciclo for non venga eseguito una sola volta con k=0 se len(self.ArrChartData) è 3 voglio che il ciclo for non venga eseguito tre volte con k=0, 1, 2 Si comporta proprio così? Grazie Il giorno 04 giugno 2013 02:02, Federico Figus ha scritto: > Ciao, > > il problema deriva dal fatto che ret è una lista vuota, quindi quando > cerchi di accedere al suo element ret[k] viene giustamente sollevata > un'eccezione IndexError proprio perchè il k-esimo elemento non esiste > (essendo una lista vuota). > > Se ho capito bene, ret dovrà essere sempre una lista di > len(self.ArrChartConfig) - 1 dizionari, che al proprio interno avranno un > indice 'data' associato ad una lista di len(self.ArrChartData) - 1 liste > di due elementi, allora dovresti inserire all'inizio del primo ciclo: > > ret.append({'data': []}) > > per poi fare un > > ret[k]['data'].append([xval, yval]) > > al posto della riga che solleva l'eccezione. > > A mio parere questo metodo non sarebbe ottimale, sia dal punto di vista > prestazionale (sia in termini di memoria che temporali) sia da quello > stilistico, potresti utilizzare le list comprehension per ottenere un > ottimo risultato: > > > def chart(self): > return [{'data': [[coords[0], coords[1]] for coords in > self.ArrChartData[:-1]]} > for _ in xrange(0, len(self.ArrChartConfig) - 1)] > > nel caso l'iterable self.ArrCharData contenga solo tuple o liste da 2 > elementi potresti anche scrive in questo modo > > def chart(self): > return [{'data': [[x, y] for x, y in self.ArrChartData[:-1]]} > for _ in xrange(0, len(self.ArrChartConfig) - 1)] > > > Spero di averti dato una mano con la risoluzione del tuo problema, fammi > sapere se funziona (e nel caso di errori dove ho sbagliato) o se c'è > qualche passaggio non molto chiaro. > Spero che il sonno non mi abbia giocato qualche brutto scherzo ;) > > P.S. se la coppia di coordinate non dovrai modificarla in futuro, ti > consiglio di usare una tupla per contenerle quindi (val[0], val[1]) > > Saluti, > Federico Figus > > ___ > Python mailing list > Python@lists.python.it > http://lists.python.it/mailman/listinfo/python > > -- Daniele San Giovanni ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] liste in Python errore costruzione matrice
errata corrige: se len(self.ArrChartData) è 3 voglio che il ciclo for venga eseguito tre volte con k=0, 1, 2 Il giorno 04 giugno 2013 10:05, Daniele San Giovanni < sangiovanni.dani...@gmail.com> ha scritto: > Ho fatto al momento la prima modifica e non viene più sollevata l' > eccezione. Quindi dovrebbe andar bene. > Ho però un altro dubbio: > Quando eseguofor i in range(0, len(self.ArrChartData) - 1): > > se len(self.ArrChartData) è 0 voglio che il ciclo for non venga > eseguito. > se len(self.ArrChartData) è 1 voglio che il ciclo for non venga eseguito > una sola volta con k=0 > se len(self.ArrChartData) è 3 voglio che il ciclo for non venga eseguito > tre volte con k=0, 1, 2 > > Si comporta proprio così? > > Grazie > > > > > > Il giorno 04 giugno 2013 02:02, Federico Figus ha > scritto: > >> Ciao, >> >> il problema deriva dal fatto che ret è una lista vuota, quindi quando >> cerchi di accedere al suo element ret[k] viene giustamente sollevata >> un'eccezione IndexError proprio perchè il k-esimo elemento non esiste >> (essendo una lista vuota). >> >> Se ho capito bene, ret dovrà essere sempre una lista di >> len(self.ArrChartConfig) - 1 dizionari, che al proprio interno avranno un >> indice 'data' associato ad una lista di len(self.ArrChartData) - 1 liste >> di due elementi, allora dovresti inserire all'inizio del primo ciclo: >> >> ret.append({'data': []}) >> >> per poi fare un >> >> ret[k]['data'].append([xval, yval]) >> >> al posto della riga che solleva l'eccezione. >> >> A mio parere questo metodo non sarebbe ottimale, sia dal punto di vista >> prestazionale (sia in termini di memoria che temporali) sia da quello >> stilistico, potresti utilizzare le list comprehension per ottenere un >> ottimo risultato: >> >> >> def chart(self): >> return [{'data': [[coords[0], coords[1]] for coords in >> self.ArrChartData[:-1]]} >> for _ in xrange(0, len(self.ArrChartConfig) - 1)] >> >> nel caso l'iterable self.ArrCharData contenga solo tuple o liste da 2 >> elementi potresti anche scrive in questo modo >> >> def chart(self): >> return [{'data': [[x, y] for x, y in self.ArrChartData[:-1]]} >> for _ in xrange(0, len(self.ArrChartConfig) - 1)] >> >> >> Spero di averti dato una mano con la risoluzione del tuo problema, fammi >> sapere se funziona (e nel caso di errori dove ho sbagliato) o se c'è >> qualche passaggio non molto chiaro. >> Spero che il sonno non mi abbia giocato qualche brutto scherzo ;) >> >> P.S. se la coppia di coordinate non dovrai modificarla in futuro, ti >> consiglio di usare una tupla per contenerle quindi (val[0], val[1]) >> >> Saluti, >> Federico Figus >> >> ___ >> Python mailing list >> Python@lists.python.it >> http://lists.python.it/mailman/listinfo/python >> >> > > > -- > Daniele San Giovanni > -- Daniele San Giovanni ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] liste in Python errore costruzione matrice
> > Quando eseguofor i in range(0, len(self.ArrChartData) - 1): > > se len(self.ArrChartData) è 0 voglio che il ciclo for non venga > eseguito. > se len(self.ArrChartData) è 1 voglio che il ciclo for non venga eseguito > una sola volta con k=0 > se len(self.ArrChartData) è 3 voglio che il ciclo for venga eseguito tre > volte con k=0, 1, 2 Nel tuo caso avrai: se len(self.ArrCharData) == 0 allora avrai range(0, -1) cioè [] se len(self.ArrCharData) == 1 allora avrai range(0, 0) cioè [] se len(self.ArrCharData) == 2 allora avrai range(0, 1) cioè [0] se len(self.ArrCharData) == 3 allora avrai range(0, 2) cioè [0, 1] se vuoi evitare che il ciclo venga eseguito per len(self.ArrCharData) uguale a 0 o a 1, allora ti consiglio di mettere prima del ciclo queste due righe di codice: if len(self.ArrCharData) < 2: continue Altro piccolo consiglio, quando ti serve un contatore usa xrange() al posto di range(), il primo rende un generator il secondo una list. In più non hai bisogno di specificare 0 visto che parte sempre da zero se non specifichi due argomenti, quindi: range(n) -> [0, 1, , n-1] ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] Overloading "print"
Salve a tutti, ho un programma di decine di migliaia di righe di codice che spesso e volentieri utilizza print come output di debug, pur avendo un'interfaccia windowed. Come faccio a fare l'overloading del print in modo da non dover eliminare tutti i print presenti nel codice? C' un modo semplice per ridefinire la funzione print in modo ad esempio che stampi in console solo se un certo booleano è true? Grazie Vittorio ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Overloading "print"
Il giorno 04 giugno 2013 16:26, Vittorio Spina ha scritto: > Come faccio a fare l'overloading del print in modo da non dover eliminare > tutti i print presenti nel codice? > puoi provare ridefinendo lo stdout import sys sys.stdout = open('file', 'w') print 'test' vedi qui: http://stackoverflow.com/questions/4675728/redirect-stdout-to-a-file-in-python e qui: http://stackoverflow.com/questions/1218933/can-i-redirect-the-stdout-in-python-into-some-sort-of-string-buffer ciao, Marco ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Overloading "print"
Il 04/06/2013 16:29, Marco De Paoli ha scritto: Il giorno 04 giugno 2013 16:26, Vittorio Spina mailto:vittorio.sp...@gmail.com>> ha scritto: Come faccio a fare l'overloading del print in modo da non dover eliminare tutti i print presenti nel codice? puoi provare ridefinendo lo stdout import sys sys.stdout = open('file', 'w') print 'test' vedi qui: http://stackoverflow.com/questions/4675728/redirect-stdout-to-a-file-in-python e qui: http://stackoverflow.com/questions/1218933/can-i-redirect-the-stdout-in-python-into-some-sort-of-string-buffer ciao, Marco perfetto, grazie mille. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Overloading "print"
Ciao, l'override dell'istruzione print non è possibile in python 2.x, ma lo è in python 3.x. Per aggirare il problema potresti definire un file-like object che possieda almeno il metodo write, al cui interno ci implementi la logica di scritura, ad esempio: import sys _stdout = sys.stdout class FaskeStdout(object): can_write = 1 def write(self, data): if self.can_write: _stdout.write(data) sys.stdout = FakeStdout() print "stampa sullo stdout" sys.stdout.can_write = 0 print "non stampa sullo stdout" La seconda soluzione sarebbe creare la tua funzione print con un alias (e.g. print_log()) e modidicare tutto il codice con un semplice find&replace, così potrai controllare la meglio tutta questa parte in futuro. Saluti, Federico F. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Overloading "print"
Il 04/06/2013 17:03, Federico Figus ha scritto: Ciao, l'override dell'istruzione print non è possibile in python 2.x, ma lo è in python 3.x. Per aggirare il problema potresti definire un file-like object che possieda almeno il metodo write, al cui interno ci implementi la logica di scritura, ad esempio: import sys _stdout = sys.stdout class FaskeStdout(object): can_write = 1 def write(self, data): if self.can_write: _stdout.write(data) sys.stdout = FakeStdout() print "stampa sullo stdout" sys.stdout.can_write = 0 print "non stampa sullo stdout" La seconda soluzione sarebbe creare la tua funzione print con un alias (e.g. print_log()) e modidicare tutto il codice con un semplice find&replace, così potrai controllare la meglio tutta questa parte in futuro. ho pensato a fare un overloading perchè non e' semplice cambiare tutti i print con un find&replace. la riga print "ciao mondo" dovrebbe diventare print_log("ciao mondo") e l'ultima parentesi tonda chiusa non saprei proprio come inserirla... Con il file-like object del print ha funzionato, adesso ho un flag che funziona così: if not flag: print "Verbose is OFF!!!" from overloadprint import * sys.stdout=OverloadPrint() dove overloading.py contiene il codice: class OverloadPrint(): def write(self, text): pass Saluti, Federico F. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Overloading "print"
Il giorno 04 giugno 2013 17:08, Vittorio Spina ha scritto: > cambiare tutti i print con un find&replace. > la riga > > print "ciao mondo" > > dovrebbe diventare > > print_log("ciao mondo") > > e l'ultima parentesi tonda chiusa non saprei proprio come inserirla... > > se sei in vim puoi fare una cosa del genere :%s/print "\(.*\)"/print("\1")/ la parentesi nell'espressione regolare crea un group che poi puoi riutilizzare nella parte di replace ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Overloading "print"
2013/6/4 Vittorio Spina ho pensato a fare un overloading perchè non e' semplice cambiare tutti i > print con un find&replace. > la riga > > print "ciao mondo" > > dovrebbe diventare > > print_log("ciao mondo") > > e l'ultima parentesi tonda chiusa non saprei proprio come inserirla... > Il comando di Marco funziona ma solo se stampi una stringa e basta, se vuoi stampare anche una variabile devi usare questo: :%s/\ in vim corrispondono al \b delle regex -- 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] Overloading "print"
Il giorno 04 giugno 2013 17:22, Marco Beri ha scritto: > > :%s/\ > uhm, i doppi-apici dentro le parentesi di print_log non mi tornano tanto... secondo me non ci vanno: :%s/\___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Overloading "print"
2013/6/4 Marco De Paoli > > Il giorno 04 giugno 2013 17:22, Marco Beri ha > scritto: > >> :%s/\> >> uhm, i doppi-apici dentro le parentesi di print_log non mi tornano > tanto... > > secondo me non ci vanno: > :%s/\ Ovviamente hai ragione!!! Avevo preso la tua istruzione per correggerla e non li ho tolti. Grazie! :-) 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] Overloading "print"
Il giorno 04 giugno 2013 17:29, Marco Beri ha scritto: > Avevo preso la tua istruzione per correggerla e non li ho tolti. > incredibile! ... trovare un baco al Beri sulle istruzioni regolari?!? Non ha prezzo! :-) per i posteri: confermo che la forma di marcoberi è decisamente più generale ciao, Marco ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Overloading "print"
2013/6/4 Marco De Paoli > Il giorno 04 giugno 2013 17:29, Marco Beri ha > scritto: > > Avevo preso la tua istruzione per correggerla e non li ho tolti. >> > > incredibile! > ... trovare un baco al Beri sulle istruzioni regolari?!? > Non ha prezzo! :-) > :-D Meno male che la lista la leggono in tre o quattro... -- 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] Overloading "print"
On Tue, 2013-06-04 at 17:08 +0200, Vittorio Spina wrote: > la riga > > print "ciao mondo" > > dovrebbe diventare > > print_log("ciao mondo") Se hai deciso di eliminare tutti i print (cosa che consiglio alla grande), penso che la cosa migliore sia sostituirli con logging.info (o logging.debug). Quello che stai facento è un logging fatto a mano: dai un'occhiata al modulo per vedere se ha feature che ti possono interessare: http://docs.python.org/2/library/logging.html -- Daniele ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Overloading "print"
Il 04 giugno 2013 18:01, Marco Beri ha scritto:: > 2013/6/4 Marco De Paoli >> Il giorno 04 giugno 2013 17:29, Marco Beri ha >> scritto: >>> Avevo preso la tua istruzione per correggerla e non li ho tolti. >> >> incredibile! >> ... trovare un baco al Beri sulle istruzioni regolari?!? >> Non ha prezzo! :-) > > :-D > Meno male che la lista la leggono in tre o quattro... Si`, ma sono i tre o quattro che contano ;) Non ho tempo di provare la tua RE, ma sarei curioso di sapere come si comporta con:: print senza_andare_a_capo, print con #commento in linea print "concatenando"\ " due stringhe" print """due righe""" # print da sola print print >> file, qualcosa :-? -- © 2013 :: R K--S L ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Overloading "print"
2013/6/4 Carlo Miron > Non ho tempo di provare la tua RE, ma sarei curioso di sapere come si > comporta con:: > > print senza_andare_a_capo, > print con #commento in linea > print "concatenando"\ > " due stringhe" > print """due > righe""" > # print da sola > print > print >> file, qualcosa > print_log(senza_andare_a_capo,) print_log(con #commento in linea) print_log("concatenando"\) " due stringhe" print_log("""due) righe""" # print_log(da sola) print print_log(>> file, qualcosa) Direi che toppa praticamente sempre :-) Ma chissenefrega, solo un aspie potrebbe usare la print in quel modo. 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] Overloading "print"
print_log(senza_andare_a_capo,) print_log(con #commento in linea) print_log("concatenando"\) " due stringhe" print_log("""due) righe""" # print_log(da sola) print print_log(>> file, qualcosa) Direi che toppa praticamente sempre :-) Ma chissenefrega, solo un _*aspie*_ potrebbe usare la print in quel modo. questa potevi evitartela ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Overloading "print"
2013/6/4 Vittorio Spina >print_log(senza_andare_a_capo,) > > print_log(con #commento in linea) > print_log("concatenando"\) >" due stringhe" > print_log("""due) >righe""" > # print_log(da sola) > print > print_log(>> file, qualcosa) > > > Direi che toppa praticamente sempre :-) > > Ma chissenefrega, solo un *aspie* potrebbe usare la print in quel modo. > > questa potevi evitartela > Boh, non direi. Un sospetto aspie è Sheldon Cooper per esempio: http://en.wikipedia.org/wiki/Sheldon_Cooper Ad ogni modo se ho offeso te o qualcun'altro me ne dispiaccio. Per esempio avrei potuto dire "solo un cretino" e probabilmente si sarebbero sentite offese, a torto, molte meno persone. 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