[PIPython] gestire colonne di dati

Alex Martelli aleaxit
Ven 19 Nov 2004 15:16:43 CET


On Thursday 11 March 2004 04:24 pm, Federico Nati wrote:
> ciao,
>
> elegante. solo che io avevo fatto la versione piu' rozza con il ciclo
> nella quale avevo facilmente implementato un controllo sul primo
> carattere della linea: se corrisponde a "#" o a ";" la faccio saltare
> (in sostanza si tratterebbe di un commento. Qui invece non saprei come
> fare.

Cambia il codice originale:

> > matrice=[map(int, line.split()[:2]) for line in
> > file('tuofile').readlines()]

aggiungendo una condizione acche` una riga venga considerata (suggerirei
anche per semplicita` di usare un'altra list comprehension invece di map!):

matrice=[[int(x) for x in line.split()[:2]]
              for line in file('tuofile').readlines()
              if line[0] not in '#;\n'
             ]

ho skippato anche le linee vuote -- in un file in cui si ammettono
commenti mi parrebbe assurdo non ammettere anche righe vuote!

> Inoltre l'ideale sarebbe che per file con una singola colonna venisse
> restituita una lista di numeri, e non una lista di liste con un singolo
> numero.

A questo scopo (indifferentemente che tu usi per il lavoro base una LC
o un ciclo) occorre ovviamente del codice in piu` (che trasformi le liste
con un solo elemento nell'elemento stesso).  Io lo metterei in una
funzioncina per chiarezza:

def ifsing(L):
    if len(L) == 1: return L[0]
    else: return L

forse_matrice_forse_vettore = [ ifsing([int(x) for x in line.split()[:2]])
              for line in file('tuofile').readlines()
              if line[0] not in '#;\n'
             ]

naturalmente ho cambiato il nome della variabile in quanto diviene
cosi` totalmente misterioso se si tratti veramente di una matrice
oppure invece di un vettore (auguri relativamente alla facilita` di
manipolarla decentemente in tutto il seguito del programma, comunque
ognuno si sceglie gli ideali suoi...!-).


Alex




More information about the Python mailing list