基于CSV文件中的数据计算的返回列表(WITHOUT CSV MODULE)

时间:2012-11-15 02:54:06

标签: python list csv dictionary

我要做的是阅读一个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(TD - Rush TD)4个点

    • 每冲6便士(Rush TD)

    • 每25码传球1次(传球次数)

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

    • 如果完成率超过70%(Pct)

    • ,则获得20点奖金
    • -2每袋(Sack)

    • -6每个丢失的摸索(FumL)

  3. 根据有点像这样的点数返回(或打印,无论如何)前20名

    Name________________________Team__________________Points
    ====________________________====__________________======
    player name_____________    their team______________how many points they have
    
  4. 我迷失了,我真的需要一些帮助,感谢所有能提供一些见解的人:)

    这就是我所在的地方:

    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 ======')
    

1 个答案:

答案 0 :(得分: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))