Quindi vuoi creare un elenco di elenchi ... Dobbiamo iniziare con un elenco vuoto
list_of_lists = []
poi, leggiamo il contenuto del file, riga per riga
with open('data') as f:
for line in f:
inner_list = [elt.strip() for elt in line.split(',')]
# in alternative, if you need to use the file content as numbers
# inner_list = [int(elt.strip()) for elt in line.split(',')]
list_of_lists.append(inner_list)
Un caso d'uso comune è quello dei dati colonnari, ma le nostre unità di archiviazione sono le righe del file, che abbiamo letto una per una, quindi potresti voler trasporre il
tuo elenco di elenchi. Questo può essere fatto con il seguente linguaggio
by_cols = zip(*list_of_lists)
Un altro uso comune è quello di assegnare un nome a ciascuna colonna
col_names = ('apples sold', 'pears sold', 'apples revenue', 'pears revenue')
by_names = {}
for i, col_name in enumerate(col_names):
by_names[col_name] = by_cols[i]
in modo da poter operare su elementi di dati omogenei
mean_apple_prices = [money/fruits for money, fruits in
zip(by_names['apples revenue'], by_names['apples_sold'])]
Gran parte di ciò che ho scritto può essere accelerato utilizzando il csv
modulo, dalla libreria standard. Un altro modulo di terze parti è pandas
, che ti consente di automatizzare la maggior parte degli aspetti di una tipica analisi dei dati (ma ha una serie di dipendenze).
Aggiornamento Mentre in Python 2 zip(*list_of_lists)
restituisce un elenco di elenchi (trasposto) diverso, in Python 3 la situazione è cambiata e zip(*list_of_lists)
restituisce un oggetto zip non sottoscrivibile.
Se hai bisogno di accesso indicizzato puoi usare
by_cols = list(zip(*list_of_lists))
che ti dà un elenco di liste in entrambe le versioni di Python.
D'altra parte, se non hai bisogno di accesso indicizzato e quello che vuoi è solo costruire un dizionario indicizzato dai nomi delle colonne, un oggetto zip va bene ...
file = open('some_data.csv')
names = get_names(next(file))
columns = zip(*((x.strip() for x in line.split(',')) for line in file)))
d = {}
for name, column in zip(names, columns): d[name] = column