python - 使用 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
解决方案
如果您尝试对每行的最后一个元素进行排序,则空格会引发错误。另外,我认为你的脚本也会考虑标题行进行排序,所以如果你不想考虑这一点,你应该在排序时跳过该行。
如果您想根据文件结构以您想要的方式打印分数,您可以执行以下操作:
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']))
推荐阅读
- bash - 在 shell 中将换行符作为参数传递
- python - 在给定的用户输入日期获取一个月的第一天和最后一天
- javascript - 如何在 ajax 调用中使用 php 中的图像附加 formdata?
- java - java格式字符串“%,d”和“%,d”
- r - temp [requiredperson, ] 中的错误:下标越界
- php - 使用 JQuery 验证和 PHP 处理
- android - Android 服务:检测数据连接是否可用 Wifi 或移动数据
- android - Realm 5.8.0在Android下导致dex错误
- jenkins - 将整个 Jenkins 阶段提取到共享库?
- c++ - 使用赋值运算符 =? 时 C++ 中的编译错误