Python 使用csv的前5名分数
我很难从csv文件中显示前5名的分数。 这是我当前的代码:Python 使用csv的前5名分数,python,csv,Python,Csv,我很难从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])) with
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]))
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']))
这是我目前得到的:
>>> leaderboards()
0 | Name | Score
1 | Ryan | 3
2 | Liam | 12
3 | Steve | 3
4 | Donald | 3
5 | Alan | 3
6 | Harry | 1
我想实现两个主要元素,但不知道如何实现。
他们将对分数进行排序,以使最高分数位于顶部,并将排行榜显示的玩家数量限制为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]))
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高。我不知道为什么,但也许你会意识到一些事情。再一次,非常感谢您,我很抱歉,我只是问了这么多,但就编码知识而言,这超出了我的能力范围如果你试图对每一行的最后一个元素排序,空白空间会引发一个错误。另外,我认为你的脚本也会考虑头行排序,所以如果你不打算考虑这一点,你应该跳过该行排序时。 如果要根据文件结构以所需方式打印分数,可以执行以下操作:
以open(“…文件名此处…”,“'r')作为数据:
reader=csv.reader(数据)
对于idx,枚举(读取器)中的行:
打印“{}}{}}{}”。格式(str(idx),第[0]行,第[2]行]
这将根据您为csv编制索引的方式逐行打印内容。由于您有一个标题行,我还建议您查看Python csv模块中的DictReader
。这样你就不必在将来依赖于指数头寸
此外,如果您在csv中有额外行的问题,请查看
根据评论中的请求更新排序:
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列中的相应键使用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']))
您好,您正在尝试从每一行访问值[-1],但由于您的csv文件有空行,因此会引发错误。我已编辑了我的问题,如果您能查看,我将不胜感激。谢谢!:)@我为你更新了答案。这应该是你想要的。很抱歉再次询问,但我如何在代码中实现这一点?正如我目前所做的那样,它输出的结果是:[[Name]、[Password]、[Score]、[Ryan]、[pass]、[3']、[Steve]、[pass]、[3']、[Donald]、[Adadaddad]、[3']、[Alan]、[Adadaddad]、[3']]这并不理想,因为首先分数都被设置为相同的,并且已经失去了格式。非常感谢您迄今为止的帮助。@Arctic我在上面为您添加了几个选项。我已经尝试了您提供的两个选项,但是我已经在编辑中介绍了这个问题。