0

我要做的是读取一个 CSV 文件,其中包含用于梦幻足球队的统计数据。该文件如下所示:

Name    Team    G   QBRat   Comp    Att Pct Pass    Yds Pass    YG  Yds Att TD  Int
Matt    Flynn   GNB 5   124.8   33  49  67.3    518 103.6   10.6    6   2
Aaron   Rodgers GNB 15  122.5   343 502 68.3    4643    309.5   9.2 45  6
Tyrod   Taylor  BAL 3   118.8   1   1   100 18  6   18  0   0
Brian   Hoyer   NWE 3   118.8   1   1   100 22  7.3 22  0   0
Drew    Brees   NOR 16  110.6   468 657 71.2    5476    342.3   8.3 46  14
 ... etc.

我做这件事的时间有限,而且我需要它简单——这意味着我不能使用该csv模块,也不能使用一堆高级命令来执行它(我的意思是我可以,但我没有如果我看不懂就想用它)。

我要做的是:

  1. 从文件中读取统计信息。基本上有 6 个不同的 CSV 文件,因为我必须根据四分卫、跑卫、外接手、近端锋、踢球手和球队的整体防守来计算和返回统计数据列表。现在我只会以四分卫为例。

  2. 从此 CSV 文件创建一个点系统。我必须查看每个玩家的名字,并根据他们的统计数据添加或减去一定数量的积分:

    • 每个传球 TD 4 分 (TD - Rush TD)

    • 每冲 TD (冲 TD) 6 分

    • 每传球 25 码得 1 分(Pass Yds)

    • 如果完成率超过 60% (Pct),则 10 分

    • 如果完成率超过 70% (Pct),则奖励 20 分

    • -2 每个麻袋(麻袋)

    • -6 每次失手 (FumL)

  3. 返回(或打印,无论如何) top 20,在基于点数的列表中,有点像这样:

    Name________________________Team__________________Points
    ====________________________====__________________======
    player name_____________    their team______________how many points they have
    

我迷路了,我真的需要一些帮助,感谢所有能提供一些见解的人:)

这就是我所在的地方:

def qtrBacks():
    qb = open('NFL2011QB.csv', 'r')
    points = 0
    for Name in qb:


print('Top Quarterbacks')
print()
print('Name\t\t Team\t Points')
print('====\t\t ====\t ======')
4

1 回答 1

0

我建议将工作分解为几个功能。这可以帮助您将工作组织成可以单独调整或修改的单独部分。

首先,我建议处理文件解析。这很重要,因为它是我们确定将保存玩家数据的数据结构的地方。我认为将每个玩家的统计数据保存在字典中是有道理的,从每个统计数据名称(如“TD”)映射到值。这是一个函数,它使用列表推导来构建此类词典的列表,每个玩家一个,从文件的标题中获取统计名称。如果文件的每一列都没有正确的标题,这可能无法正常工作。

def read_player_file(filename):
    with open(filename) as f:
        head = f.readline().split("\t")

        player_list = [dict(zip(head, line..strip().split("\t"))) for line in f]

    return player_list

上面的代码几乎等同于您可以对csv模块执行的操作,尽管它可能也无法处理稍微混乱的文件。这是使用的替代版本csv.DictReader

def read_player_file(filename):
    with open(filename, "rb") as f:
        return player_list = list(csv.DictReader(f))

这两种实现都(希望)独立于文件的细节,因此您可以将它们用于每个 CSV 文件,即使它们具有不同的统计信息。

接下来要编码的是评分功能。我不完全确定如何为您列出的规则执行此操作,因为TD您的示例数据中只有一列(没有单独的运行 TD 值),并且没有用于麻袋或摸索的列。

def qb_score(player_dict):             # FIXME: Replace ? values!
    run_td = ?
    pass_td = int(player_dict["TD"]) - run_td
    pass_yards = int(player_dict["Yds Pass"])
    sacks = ?
    fumbles = ?
    completion_rate = float(player_dict["Pct Pass"])

    score = 4*pass_td + 6*run_td + pass_yards//25 - sacks*2 - fumbles*4

    if completion_rate > 60:
        score += 10
    if completion_rate > 70: # maybe this should be an elif?
        score += 20

    return score

现在,我们可以将它们组合在一起并返回得分最高的 QB:

def top_qbs(count=20):
    qb_list = read_player_file("NFL2011QB.csv")

    for qb in qb_list:
        qb["qb score"] = qb_score(qb)

    qb_list.sort(key=lambda qb:qb["qb score"], reversed=True)

    return qb_list[:count]

您可以使用以下内容进行打印输出:

def print_top_qbs():
    qbs = top_qbs()

    print('Top Quarterbacks')
    print()
    print('Name\t\t Team\t Points')
    print('====\t\t ====\t ======')
    for qb in qbs:
        print("{Name}\t{Team}\t{qb score}".format(**qb))
于 2012-11-20T06:33:53.077 回答