[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