Newsgroup: it.comp.programmare
Titolo: Posso azzardare?

Si lo ammetto sto praticamente chiedendo la pappa pronta.
il punto e' che sobno nuovo del linguaggio python, me ne hanno
parlato bene e quindi vorrei provare ad utilizzarlo per i miei cgi.
Non c'e' niente di meglio per imparare un linguaggio che mettersi degli
obiettivi.
Quello che vorrei fare e':
avendo il seguente file di testo
01200022000000108001350
01200022000000112001358
01200022000000210001350
01200022000000210001829
01200022000000211001353
01200022000000310001355
01200022000000311001401
01200022000000412001448
01200022000000412001818
01200022000000512001355
01200022000000611001427
01201943100001812000718
01201943100001812001449
01201943100001907000720
01201943100001909000719
01201943100001910000720
01201943100001912000724
01201943100002007000709
01201943100002009000718
01201943100002009001519
78202657100000102020819
78202657100000102021553
78202657100000402020816
78202657100002801020824
78202657100002801021548
78202657100002901020822
78202657100003001020825
78202657100003101021559
78202663000002501021403
78202783000002501021402
vorrei ordinarlo per data.
La data inizia dal carattere 14 fino al 19 ed e' ggmmaa.
Immagino che prima debba trasformare ggmmaa in aammgg.
Sono a zero col python.
Potete darmi una dritta?
Grazie.

Potete darmi una dritta?
Sì, non ti scrivo però il codice almeno puoi imparare.
Allora data una stringa (o una lista) puoi estrarre i caratteri dalla
posizione start alla posizione end (compresa) con
nome_variabile[start:end + 1].
Es.
print "0123456789"[2:5]
stampa "234"
Quindi leggi tutto il file riga per riga (usando il metodo di file
readlines) e per ogni riga estrai giorno, mese ed anno e li converti
in intero con la funzione int. Adesso confronti le due stringhe in
base ai dati che hai estratto.
Adesso sai come confrontare due stringhe ma come ordinare la lista?
Le liste hanno un metodo sort ma se applicato su una lista di stringhe
non ottieni ciò che vorresti tu, però puoi passare una funzione (o
qualsiasi altro callable) come unico argomento di sort. Questa
funzione ritorna -1 se il primo argomento che le è passato e minore
del primo, 0 se sono uguali, 1 altrimenti.
Es.
def my_cmp(x, y):
    if x > y:
        return 1
    if x < y:
        return -1
    else:
        return 0
l = [0, 5, 3, 2]
l.sort(my_cmp)
print l
stampa [0, 2, 3, 5]
Tutto quello che devi fare è adattare my_cmp ai tuoi bisogni.
Se usi Python 2.2 potresti anche derivare una classe dal tipo built-in
list in modo che sort ordini automaticamente in base ai tuoi criteri,
ma probabilmente è una soluzione un po' esagerata er i tuoi bisogni.
-- 
Marco Barisione

 Tutto quello che devi fare č adattare my_cmp ai tuoi bisogni.
Perdonami.
L'iniziale confronto delle 2 stringhe a cosa mi servirebbe?
Da quello che ho capito mi basterebbe inserire i records nella lista e poi
generarmi la funzione di confronto in base alle sosttostringhe gg mm e aa
estratte dalle singole righe da passare alla sort.
Pero' in questo modo dovrei caricarmi in memoria un file di 24 Mb?
Ciao.

Pero' in questo modo dovrei caricarmi in memoria un file di 24 Mb?
Penso che se vuoi ordinarlo sia l'unica alternativa (anche se potrei
dire cavolate visto che oggi ho fatto 8 ore di Calcolo II e
Meccanica).
-- 
Marco Barisione (ICQ 84277092)

 dire cavolate visto che oggi ho fatto 8 ore di Calcolo II e
Si possono ordinare file piu` grandi (anche MOLTO piu` grandi) della
memoria disponibile con tecniche e algoritmi sviluppati e raffinati negli 
anni '50 e '60, quando 64 KByte di RAM erano tanto per un mainframe ma
i file da ordinare erano gia` grossettini (centomila clienti con 100
byte per cliente = 10 Mbyte... su di un nastro ci stavano gia` comodi).
Il nome generale e` "tecniche di sorting esterno".  Mergesort e` il
piu` semplice.  Affascinante l'approccio "multi-tape mergesort" (allora
anche i dischi, o tamburi, costavano carissimi: i nastri erano la vera
"memoria di massa").
Al giorno d'oggi 24 MB sono noccioline, e leggerli in memoria e
ordinarli li` e` sicuramente la cosa piu` veloce.  Ma se mai dovrai
sortare 4-8 GB su di una macchina piccola, con solo 500 MB di
memoria centrale disponibile ma abbastanza GB liberi su disco, il
buon vecchio "N-tape mergesort" potrebbe ancora tornarti utile...!
Alex

 Pero' in questo modo dovrei caricarmi in memoria un file di 24 Mb?
Si`, ma se il tutto (file e dati ausiliari) sta in memoria fisica resta
l'approccio piu` veloce - meglio slurpare tutto subito che non un poco
alla volta.  Se in memoria fisica non ci stai, allora meglio mergesort,
ma stiamo parlando di ordini di grandezza di differenza di prestazioni.
Alex

 Alex
per sapere se "ci sto" in memoria o no,
bisogna considerare la memoria virtuale dei moderni SO?
in questo caso si potrebbe effettuare un semplice sort anche su moli di dati
molto grandi
(mi sembra 4GB sui sistemi 32 bit, sbaglio?). in pratica ci pensa il sistema
a fare il merge!
che, ho detto cavolate? :-)
--
Ciao by Allanon

 che, ho detto cavolate? :-)
Non esattamente, ma se pensi di stare lavorando in condizioni critiche di 
memoria _fisica_ rispetto a working set non puoi assolutamente "lasciar 
fare al sistema" se non vuoi distruggere le prestazioni.  Considera che 
"portare una pagina in memoria" e` uno sforzo enorme (prende il tempo
di migliaia di istruzioni macchina, visto che deve leggerla da disco) e 
quindi e` indispensabile che lo "ammortizzi" facendo il massimo del lavoro 
possibile su quei dati sinche` li hai sotto mano, piuttosto che non usare 
un dato qui, un dato la, un altro ancora costa`, eccetera, senza cura per 
la paginazione (dimensione del working set) che questo puo` causare.
L'argomento e` importante e decisamente avanzato.  L'alternativa, quella di 
scrivere programmi il cui working set e` sicuramente minore della memoria 
disponibile in quanto tale e` anche il totale di memoria virtuale occupata 
dai programmi stessi, e` decisamente piu` semplice e come tale da 
perseguire se appena appena cio` sia possibile.
Alex