Есть ли способ динамически построить список в Python - PullRequest
0 голосов
/ 02 февраля 2019

Я совершенно новичок в python и в основном новичок в программировании в целом.У меня есть задание колледжа, которое включает сканирование файла CSV и сохранение каждой строки в виде списка.Мой файл представляет собой список футбольных данных за сезон премьер-лиги, поэтому CSV-файл имеет следующую структуру:

date; home; away; homegoals; awaygoals; result;
01/01/2012; Man United; Chelsea; 1; 2; A;
01/02/2012; Man City; Arsenal; 1; 1; D;

и т. Д. И т. Д.

В настоящий момент каждый столбец хранится в переменной.:

date = row[0]
home = row[1]
away = row[2]
homegoals = row[4]
awaygoals = row[5]

Таким образом, в настоящее время я могу получить доступ, например, ко всем играм с более чем тремя целями

totalgoals = homegoals+awaygoals

if totalgoals > 3:
   print(date, home, homegoals, awaygoals, away)

Я могу получить доступ ко всем играм, в которых участвует определенная команда:

if (home or away) == "Man United":
   print(date, home, homegoals, awaygoals, away)

Очень простой, я знаю.Я хочу быть в состоянии отслеживать вещи более подробно.Так, например, я хотел бы иметь возможность получить доступ к результатам, в которых команда не выиграла в 3 играх и т. Д. Я хотел бы узнать, находится ли команда на низком счете.

Теперь,чтение на некоторое время мне кажется, что вы делаете это с помощью комбинации словаря и списка (ов).

Пока:

import csv

with open('premier_league_data_1819.csv') as csvfile:
readCSV = csv.reader(csvfile, delimiter=';')

dates = []
hometeams = []
awayteams =[]
homegoals = []
awaygoals = []
results = []

next(readCSV)

for row in readCSV:
    date = row[0]
    home = row[1]
    away = row[2]
    hg = int(row[3]) #Home Goals
    ag = int(row[4]) #Away Goals
    ftr = row[6]     #Result


    dates.append(date)
    hometeams.append(home)
    awayteams.append(away)
    homegoals.append(hg)
    awaygoals.append(ag)
    results.append(ftr)

, если кто-то может указатьмне в правильном направлении на этом я буду благодарен.Было бы неплохо узнать лучший способ достижения этой цели, чтобы я не крутил свои колеса в замешательстве.

Я думаю, что для начала мне нужно сначала сохранить все игры команд в списке, а затем добавитьэтот список в словаре, который содержит записи всех команд с именем команды в качестве ключа.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Существует также метод DictReader, который вы можете использовать следующим образом:

data = []
with open('premier-league.csv') as csvfile:
     reader = csv.DictReader(csvfile, delimiter=';')
     for row in reader:
        data.append(row)

print(data[0][' home']) # <-- note the space
#=>  Man United

Обратите внимание, что в вашем CSV после разделителя есть пробел, должно быть лучшеесли вы можете изменить файл CSV на:

date;home;away;homegoals;awaygoals;result;
01/01/2012;ManUnited;Chelsea;1;2;A;
01/02/2012;ManCity;Arsenal;1;1;D;

В качестве альтернативы, используйте

reader = csv.DictReader(csvfile, delimiter=';', skipinitialspace=True)
0 голосов
/ 02 февраля 2019

Хорошо, что вы уже используете модуль csv - он избавит вас от головной боли при разборе ваших данных.Вы также можете проверить класс DictReader в этом модуле - он будет возвращать строки с именами столбцов в качестве ключей без какой-либо дополнительной обработки, которую я включаю ниже.Вы хотите сгруппировать статистику для каждой игры вместе, чтобы вы могли проводить агрегацию.Я бы подошел к этому примерно так:

games = []

for row in readCSV:
  date, home, away, hg, ag, ftr = row[0:-1]  # this is called 'unpacking'
  # alternatively: date, home, away, hg, ag, ftr, _ = row
  # using _ this way to consume and ignore a value is another python idiom

  # This creates a dictionary where you can retrieve values by key, rather than index
  games.append(dict(date=date, home=home, away=away, hg=hg, ag=ag, ftr=ftr)

Теперь, когда у вас есть список словарей, по одному для каждой игры, вы можете взаимодействовать с ними более естественным образом:

games[0]['home']  # The home team of the first game
# All 'Man United' games
man_united = [game for game in games if 'Man United' in (game['home'], game['away'])]  
sum(game['hg'] for game in games)  # total number of home goals for all games.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...