首页 > 解决方案 > 使用 csv 的前 5 个分数

问题描述

我很难从 csv 文件中显示前 5 个分数。这是我当前的代码:

def leaderboards():
    with open('userData.csv', 'r') as data:
        reader = csv.reader(data)
        for idx, row in enumerate(reader):
            print('{} | {} | {}'.format(str(idx), row[0], row[2]))  

这是我目前得到的:

>>> leaderboards()
0 | Name | Score
1 | Ryan | 3
2 | Liam | 12
3 | Steve | 3
4 | Donald | 3
5 | Alan | 3
6 | Harry | 1

我想实现两个主要元素,但不知道如何实现。他们将对分数进行排序,以使最高分数在顶部,并将排行榜显示的玩家数量限制为 5。

当前代码:

    with open('userData.csv', 'r') as data:
                reader = csv.DictReader(data)
                newList = sorted(reader, key=lambda row: row['Score'],
reverse=False)[0:5]
                print ('  | Name | Score')
                for i, r in enumerate(newList):
                    print('{} | {} | {}'.format(str(i), r['Name'], r['Score']))

当前结果:

  | Name | Score
0 | Liam | 12
1 | Harry | 2
2 | Ryan | 3
3 | Steve | 3
4 | Donald | 3

它在大多数情况下都有效,但是 2 比 3 高。我不太确定为什么,但也许你可能会意识到一些事情。再一次,非常感谢你,很抱歉我只是问了这么多,但就编码知识而言,这超出了我的范围。:D

标签: pythoncsv

解决方案


如果您尝试对每行的最后一个元素进行排序,则空格会引发错误。另外,我认为你的脚本也会考虑标题行进行排序,所以如果你不想考虑这一点,你应该在排序时跳过该行。

如果您想根据文件结构以您想要的方式打印分数,您可以执行以下操作:

with open('...file name here...', 'r') as data: reader = csv.reader(data) for idx, row in enumerate(reader): print '{} | {} | {}'.format(str(idx), row[0], row[2])

这将根据您对 csv 的索引方式逐行打印出来。由于您有一个标题行,我还建议您DictReader在 Python csv 模块中查看。这样您将来就不必依赖索引位置。

此外,如果您对 csv 中的额外行有疑问,请查看此答案

根据评论中的请求进行排序更新:

要对您进行排序,您reader可以根据 csv 列中的适当键使用 lambda。假设 Score 是您希望排序的列并且 Score 的索引为 2,您可以执行以下操作:

newList = sorted(reader, key=lambda row: row[2], reverse=True)

这将为您提供按第二个索引降序排列的列表。删除reverse=True用于升序列表顺序。

然后,如果您只想获取前五个条目,则可以对列表进行切片:

slicedList = newList[0:5]

然后,您可以像往常一样打印出您的清单。

更新 2 以适应第二个请求:

with open('...name of your file...', 'r') as data:
    reader = csv.reader(data)
    newList = sorted(reader, key=lambda row: row[2], reverse=True)[0:5]
    for i, r in enumerate(newList):
        print('{} | {} | {}'.format(str(i), r[0], r[2]))

上面的代码假设(来自您的原始 csv 文件)r[0] 是“名称”列,而 r[2] 是“分数”列。

此外,作为替代方案,您可以使用csv.DictReader以防列标题更改索引。替代代码将类似于:

with open('...your file name here...', 'r') as data:
    reader = csv.DictReader(data)
    #### COMMENTING THIS OUT in favor of the newList below
    # newList = sorted(reader, key=lambda row: row['Score'], reverse=True)[0:5]
    ##### EDIT to evaluate the Score as an int()
    # cast row['Score'] to an int() below so that sorted() treats the row like and int rather than str
    newList = sorted(reader, key=lambda row: int(row['Score']), reverse=True)[0:5]
    print ('  | Name | Score')
    for i, r in enumerate(newList):
        print('{} | {} | {}'.format(str(i), r['Name'], r['Score']))

推荐阅读