[Python] Operazioni tra linee differenti

Marco Beri marcoberi a gmail.com
Gio 28 Maggio 2009 21:13:02 CEST


2009/5/28 angelseth a libero.it <angelseth a libero.it>

> Ciao a tutti.
> Sono un biologo marino (quindi il mio approccio alla
> programmazione è completamente da autodidatta) e  mi sono appena scritto
> alla
> ML. Ho iniziato a usare Python da qualche mese sia per diletto che per
> lavoro.
> Spesso infatti ho bisogno di rendere automatici, precisi e veloci alcuni
> processi di analisi di dati biologici.


Questo programmillo:
#==============================

raw = """ID Date Time Val1 Val2
3522 28/04/2009 07:12:55 0,73 16,58
3664 28/04/2009 07:17:39 1,05 16,48
3665 28/04/2009 07:17:41 1,83 16,50
3666 28/04/2009 07:17:43 3,6 16,50
3667 28/04/2009 07:17:45 4,58 16,56
3668 28/04/2009 07:17:47 4,37 16,58
3669 28/04/2009 07:17:49 2,43 16,60
3690 28/04/2009 07:18:31 1,65 16,58
3691 28/04/2009 07:18:33 1,5 16,58
3712 28/04/2009 07:19:15 1,27 16,56
3713 28/04/2009 07:19:17 1,0 16,58
3714 28/04/2009 07:19:19 0,6 16,58
3772 28/04/2009 07:21:15 1,85 16,48"""

dati = sorted([line.split(" ") for line in raw.split("\n")[1:]])

liste = []
for riga in dati:
    if not liste or int(riga[0]) != int(liste[-1][-1][0]) + 1:
        liste.append([])
    liste[-1].append(riga)

for n, lista in enumerate(liste):
    print "Sequenza %d lunghezza %d" % (n, len(lista))
    for riga in lista:
        print riga[0],
    print "\n", "="*10

#==============================

Stampa questo:

Sequenza 0 lunghezza 1
3522
==========
Sequenza 1 lunghezza 6
3664 3665 3666 3667 3668 3669
==========
Sequenza 2 lunghezza 2
3690 3691
==========
Sequenza 3 lunghezza 3
3712 3713 3714
==========
Sequenza 4 lunghezza 1
3772
==========


Il lavoro "sporco" lo fanno tutto queste righe:

liste = []
for riga in dati:
    if not liste or int(riga[0]) != int(liste[-1][-1][0]) + 1:
        liste.append([])
    liste[-1].append(riga)


Ovviamente do per scontato un po' di cose:
- che la prima riga contenga gli header
- che ogni riga abbia un valore intero come primo campo
- che i campi siano separati da un solo spazio

Se non e` cosi` devi cambiare il primo split di questa riga:
    dati = sorted([line.split(" ") for line in raw.split("\n")[1:]])

Ciao.
Marco.

-- 
http://thinkcode.tv - Prossimamente su questi schermi
http://beri.it - Blog di una testina di vitello
http://stacktrace.it - Aperiodico di resistenza informatica
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: http://lists.python.it/pipermail/python/attachments/20090528/abe66280/attachment.htm 


Maggiori informazioni sulla lista Python