[Python] Operazioni tra linee differenti
Manlio Perillo
manlio_perillo a libero.it
Gio 28 Maggio 2009 21:18:22 CEST
angelseth a libero.it ha scritto:
> 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.
Ciao e ben venuto.
> Spesso infatti ho bisogno di rendere automatici, precisi e veloci alcuni
> processi di analisi di dati biologici.
> Ultimamente mi sono scontrato con un
> problema che da solo o con l'ausilio dei manuali di cui dispongo, non riesco a
> risolvere. In un file di testo contenente dati come quelli sotto riportati,
> devo raggruppare tutti i record che presentano un ID consecutivo (es. da 3664 a
> 3669).
> Per riuscirci vorrei creare tante liste diverse quante sono questi
> raggruppamenti e porre come condizione per appartenere a una stessa lista che
> la differenza tra il valore ID di una linea e quello della precedente sia
> uguale a 1. Qui sorge il problema. Non riesco a esprimere in linguaggio di
> Python questa condizione. Infatti, in tutti gli script che ho creato finora ho
> sempre avuto a che fare con operazioni che coinvolgevano termini nella stessa
> linea.
>
Allora, supponendo che come struttura dati tu scelga una lista di tuple,
come:
>>> from datetime import datetime, time
>>> [ (3522, datetime(2009, 04, 28), time(7, 12, 55), 0.73, 16.58),
(3664, ...) ]
Ossia ti crei una struttura dati usango oggetti Python per rappresentare
i vari dati.
Per raggruppare i dati, puoi usare un metodo abbastanza semplice.
# Il file da leggere
f = file('/path/to/file')
# Una lista di liste contenente tutti i dati raggruppati
data = []
# Una lista usata come accumulatore per ciascun gruppo di dati
buf = []
# Legge il file riga per riga
for line in f:
# Fa il parsing della riga, convertendo i dati in oggetti Python
# fields è una tupla, il cui primo elemento è l'ID
# TODO
fields = tuple(line.split())
# Controlla se inserire i dati in un nuovo gruppo o nel gruppo
# corrente
if not buf or (fields[0] - buf[0] == 1):
# La lista è vuota, oppure i dati appartengono allo stesso
# gruppo
buf.append(fields)
# else:
# Crea un nuovo gruppo, inserendo quello precedente nella lista
# di tutti i gruppi
data.append(buf)
buf = [fields]
Il tutto rigorosamente non testato.
Manlio
Maggiori informazioni sulla lista
Python