我很难显示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
答案 0 :(得分:1)
如果您尝试对每行的最后一个元素进行排序,则空格会引发错误。此外,我认为您的脚本还将考虑标题行进行排序,因此,如果您不想考虑该行,则应在排序时跳过该行。
如果您要根据文件结构以自己想要的方式打印分数,可以执行以下操作:
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编制索引的方式逐行打印内容。由于您有标题行,因此我也建议您查看Python csv模块中的DictReader
。这样一来,您将来就不必依赖索引位置了。
此外,如果您在csv中遇到多余的行,请查看this answer。
根据注释中的请求进行更新以进行排序:
要对reader
进行排序,您可以仅基于csv列中的相应键使用lambda。假设“分数”是您要排序的列,并且“分数”是索引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']))