有没有一种方法可以在Python中动态构建一个列表

2024-04-27 05:06:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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)

如果有人能给我指出正确的方向,我将不胜感激。 这将是很好的,知道最好的方式来实现这一点,所以我不转我的车轮越来越困惑。你知道吗

我认为首先需要将所有球队的比赛存储在一个列表中,然后将该列表添加到一个字典中,该字典以球队名称作为键保存所有球队的记录。你知道吗


Tags: 文件csvhome列表date字典rowappend
2条回答

还有一种方法^{},您可以这样使用:

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)

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

相关问题 更多 >