leggere una stringa un pezzo alla volta

Il linguaggio di programmazione Python

Manlio
Saluti.

Devo leggere una stringa un pezzo alla volta.
Ho notato la funzione buffer che sembra fare proprio al caso mio.

Come mai e' stata deprecata?
Viene effettuata comunque una copia? (la stringa la devo solo leggere)

C'e' un modo veloce per suddividere una stringa in N pezzi uguali?


Grazie  Manlio Perillo
                                            
aleaxmailcomcastnet
In forma read-only non credo che sia deprecata; usandola, non vedo
nessun warning.


intendi tipo (non testata):

lunpez = (len(s)+N-1)//N
pezzi = [ s[a:a+lunpez] 
               for a xrange(0, len(s), lunpez)
             ]
?  Penso che sia il tipo di approccio + veloce, ma cmq copia tutto; se
invece di quegli s[a:a+unpez] usassi buffer(s, a, lunpez) non ci
sarebbero copie.

Cosa ci devi fare con ciascun pezzo...?


Alex
                                            
Manlio
Ma sul manuale di riferimento e' messa tra le funzioni builtin "non 
essenziali".


Ok, allora vada per buffer, grazie per la conferma.
Io attualmente prendo un pezzo alla volta in un ciclo, usando lo slicing.


struct.unpack.

A proposito, sarebbe interessante poter fare qualcosa tipo
iList, jList = unpack("10(IH)", data)



Saluti e grazie  Manlio Perillo
                                            
aleaxmailcomcastnet
...

OK, puo` darsi che venga soppressa in 3.0, ma non c'e` da tenere il
fiato.


Non so se avrai migliori prestazioni usando buffer, prova:

Helen:~ alex$ python -mtimeit -s'x=9999*"w"' 'for i in range(0,9999,9):
x[i:i+9]'
1000 loops, best of 3: 1.05 msec per loop
Helen:~ alex$ python -mtimeit -s'x=9999*"w"' 'for i in range(0,9999,9):
buffer(x,i,9)'
100 loops, best of 3: 1.97 msec per loop
Helen:~ alex$ 

comunque vedi tu nel tuo caso specifico.



Cioe`, che differenza vorresti fra quel formato '10(IH)' e il formato
'IH'*10 ...?  Come vorresti che Python tirasse a indovinare come
dividere i (presumo) 20 elementi della tupla che risulta fra due liste?

Penso che l'aggettivo che usi sia appropriato, nello stesso senso della
nota maledizione cinese, "possa tu vivere in tempi interessanti"...


Alex
                                            
Manlio
Non avevo pensato a fare cosi' ;-)


Perche' dici che dovrebbe tirare ad indovinare?

Comunque l'esempio che avevo postato non e' corretto.
Alla fine quello che mi serve e' avere qualcosa tipo
((a1, b1), (a2, b2)..., )

Facendo invece "IH" * 20
ottengo una tupla con i valori interfogliati.
Certo, posso sempre usare ricostruire quello che mi serve, ad esempio con
[(a, b) for a, b in zip(r[1:len(r):1], r[:len(r):2])]

ma forse sarebbe meglio se fosse fatto in C direttamente.


Non la conosco, passo.




Saluti e grazie  Manlio Perillo
                                            
aleaxmailcomcastnet
Comunque mi pare di capire che quel che ti manca sono le parentesi.


Se assegni una tupla di 20 elementi a una tupla di due target, come
assegnare gli elementi al primo o al secondo target se non tirando a
indovinare?-)


Benissimo, adesso avresti una tupla di 10 elementi, e assegnarla a una
tupla di due target richiede pur sempre una sfera di cristallo.


...che non ti serve per assegnare a una tupla di due target.

Ricordo, citando da sopra, che tu vuoi fare:

iList, jList = ...qualcosa...

e allora perche` non direttamente

iList, jList = r[1::2], r[::2]

...?  (Non c'e` nessun vantaggio a farlo in un'istruzione sola,
naturalmente, meglio due assegnazioni separate).

Se quell'assegnazione a iList, jList non serve davvero, e vuoi invece
"raggruppare 2 a 2" gli elementi di una sequenza r, puoi fare

[ (r[i],r[i+1]) for i in xrange(0, len(r), 2) ]



Il modulo itertools ha parecchie implementazioni, in C molto
ottimizzato, di operazioni di trasformazione da sequenza a sequenza; se
puoi identificare qualcosa che manca, conviene proporlo come aggiunta a
itertools, e non ai millanta posti che oggi producono sequenze, di cui
uno dei tanti e` struct.  Non mi pare che si sia identificato qui uno di
questi casi.


Spiegata bene nel 2o paragrafo dell'ottima recensione che trovi a
<http://www.dooyoo.it/romanzi/sun-tzu-larte-della-guerra/409316/>...


Alex
                                            
Manlio
Si, ma come detto mi ero sbagliato.
Non volevo questo, ma l'espressione indicata piu' sopra.



Grazie, non avevo pensato ad usare range/xrange.


La mia era solo una curiosita', dato che una sintassi come "n(IH)" mi 
sembrava una buona generalizzazione.



Saluti  Manlio Perillo
                                            
ZeD
Ciao, Alex Martelli! Che stavi dicendo?


domanda da niubbo pigro che non vuole usare google :)

esiste un modo per poter dire all' interprete python di essere il piu'
fiscale possibile riguardo "warning" sull' uso di elementi deprecati/errori
"di stile"?

cioe', vorrei sapere se esiste l' equivalente di uno "use strict;" del perl
o dei flag -Wall -pedantic -std='quelche' del gcc...
                                            
Nicola
Basta usare "man python". :-)



python -W all , curiosamente. ;-) Guarda anche la doc del modulo warnings,
nella libreria standard.
                                            
ZeD
Ciao, Nicola Larosa! Che stavi dicendo?


naaaaa
molto meglio "konqueror man:python" :P


mmm, non sono del tutto sicuro che faccia cio' che chiedo (anche perche'
comunque non sono del tutto sicuro di *cosa* chiedo :P)

comunque credo che faro' un alias del genere...
python='python -Qwarnall -tt -Werror'


ti riferisci all' output di pydoc warnings? se e' cosi' non m' e' sembrato
molto illuminante...