Więc chcesz stworzyć listę list ... Musimy zacząć od pustej listy
list_of_lists = []
następnie czytamy zawartość pliku, wiersz po wierszu
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)
Typowym przypadkiem użycia są dane kolumnowe, ale nasze jednostki pamięci to wiersze pliku, które przeczytaliśmy jeden po drugim, więc możesz chcieć przetransponować
listę list. Można to zrobić za pomocą następującego idiomu
by_cols = zip(*list_of_lists)
Innym powszechnym zastosowaniem jest nadanie nazwy każdej kolumnie
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]
aby można było operować na jednorodnych elementach danych
mean_apple_prices = [money/fruits for money, fruits in
zip(by_names['apples revenue'], by_names['apples_sold'])]
Większość tego, co napisałem, można przyspieszyć za pomocą csv
modułu, z biblioteki standardowej. Innym zewnętrznym modułem jest pandas
, który pozwala zautomatyzować większość aspektów typowej analizy danych (ale ma wiele zależności).
Aktualizacja Podczas gdy w Pythonie 2 zip(*list_of_lists)
zwraca inną (transponowaną) listę list, w Pythonie 3 sytuacja uległa zmianie i zip(*list_of_lists)
zwraca obiekt zip, który nie jest indeksowany.
Jeśli potrzebujesz dostępu indeksowanego, możesz użyć
by_cols = list(zip(*list_of_lists))
to daje listę list w obu wersjach Pythona.
Z drugiej strony, jeśli nie potrzebujesz dostępu do indeksów, a chcesz tylko zbudować słownik indeksowany według nazw kolumn, obiekt zip jest w porządku ...
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