有没有办法来动态地建立在Python列表

时间:2019-02-02 16:07:22

标签: python list loops dictionary

我对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 :(得分:1)

好,你已经在使用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.

答案 1 :(得分:1)

您还可以通过这种方式使用方法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)