【问题标题】:Return list based on calculations made from data in CSV files (WITHOUT CSV MODULE)根据 CSV 文件中的数据计算的返回列表(没有 CSV 模块)
【发布时间】:2012-11-15 02:54:05
【问题描述】:

我要做的是读取一个 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 分(传球码数)

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

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

    • -2 每个麻袋(Sack)

    • -6 表示每次失球 (FumL)

  3. 返回(或打印,无论如何)前 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 ======')

【问题讨论】:

  • 你想用什么语言来做这个?
  • 您是否有不想使用csv 模块的原因?几乎任何解决方案都需要重新发明它(不完美),以便从 CSV 文件中获取数据,所以这似乎是一个愚蠢的限制。使用 csv.DictReader 之类的东西非常容易。

标签: python list csv dictionary


【解决方案1】:

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

首先,我建议处理文件解析。这很重要,因为它是我们确定将保存玩家数据的数据结构的地方。我认为将每个玩家的统计数据保存在字典中是有道理的,从每个统计数据名称(如“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))

【讨论】:

    猜你喜欢
    • 2022-07-11
    • 1970-01-01
    • 2015-01-18
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 2016-03-24
    • 1970-01-01
    相关资源
    最近更新 更多