Python 如何根据csv中的列查找前三个最高的行?
我试着遍历csv的每一行,并带回前三名的高分。只有两列,一列名为“用户”,另一列名为“高分”。我知道到目前为止我所拥有的并不多,但我完全被难住了。我觉得我可以通过存储值并迭代每一行来获得最高分数,如果它小于一个数字,则替换它,但如果我想要前三行,我不确定该怎么做 我是这样开始的:Python 如何根据csv中的列查找前三个最高的行?,python,python-3.x,csv,Python,Python 3.x,Csv,我试着遍历csv的每一行,并带回前三名的高分。只有两列,一列名为“用户”,另一列名为“高分”。我知道到目前为止我所拥有的并不多,但我完全被难住了。我觉得我可以通过存储值并迭代每一行来获得最高分数,如果它小于一个数字,则替换它,但如果我想要前三行,我不确定该怎么做 我是这样开始的: import csv a = open('highscoreslist.csv') spreadsheet = csv.DictReader(a) names = [] scores = [] for row in
import csv
a = open('highscoreslist.csv')
spreadsheet = csv.DictReader(a)
names = []
scores = []
for row in speadsheet:
names.append(row['users'])
scores.append(row['highscores'])
现在我不知道该往哪个方向走。我本打算把它们放在两个列表中,然后通过这种方式找到最高的,但它们已经在字典中了,所以我的答案可能没有意义。我也在努力学习这个概念,所以我不想在熊猫身上做。提前感谢您的帮助。这是一项非常适合的任务,老实说,Python的股票csv库几乎不值得费心:
In [36]: df = pd.read_csv("highscoreslist.csv")
In [37]: df.sort_values("highscores", ascending=False).head(3)
Out[37]:
users highscores
6 G 99032
5 F 89584
1 B 73201
(以下是该框架的创建方式):
您可以按高分对电子表格进行排序:
scores = sorted(scores, key=lambda row: row['highscores'], reverse=True)
现在排名前三的分数是分数[0]
、分数[1]
和分数[2]
我的答案不包括熊猫我做了一些类似于@Kristopher Ives的事情,通过将其作为一个订单保存,您仍然可以提取用户的用户名
scores = OrderedDict(sorted(spreadsheet.items(), key=lambda row:row[1]["highscores"]))
这可以通过
集合来完成。计数器也非常容易
import csv
from collections import Counter
players = Counter()
with open('highscoreslist.csv') as a:
spreadsheet = csv.DictReader(a)
for row in speadsheet:
name, score = row['users'], row['score']
players[name] = score
top_3 = players.most_common(3)
print(*(f'{name}: {score}' for name, score in top_3), sep='\n'))
这将以以下格式打印前三名:
name: score
name: score
name: score
如果您想在运行时执行此操作,只需按顺序存储前三名高分和相应的用户即可。在每次迭代中,检查新的higscore是否大于您拥有的三个higscore中的任何一个;如果它大于三个中最小的一个,请更换它。如果它比最大的大,则替换第一个,并向下移动其他两个。也许这个伪代码使它更容易理解
score1 = 0
score2 = 0
score3 = 0
#score3 >= score2 >= score 1
for score in file:
if score > score3:
if score <= score2:
score1 = score
elif score <= score3:
score1 = score2
score2 = score
elif score > score3:
score1 = score2
score2 = score3
score3 = score
score1=0
分数2=0
得分3=0
#得分3>=得分2>=得分1
对于文件中的分数:
如果得分>3分:
如果得分欢迎使用SO和Python。如果您正在与某人一起学习python,那么这不一定是您想要给出的答案。但它说明了一个python解决方案,以及python是如何运行的
对csv.DictReader(a)]中的行排序([(行['users',行['highscores']),key=lambda t:t[1],reverse=True)[:3]
您要求的是三个最高分,这可能是您希望也了解用户的原因,否则这将变得非常简单
给定您的代码,您面临的主要问题是在两个独立的数据结构中放置了名称和分数
因此,将数据放入相同的数据结构中。为此,您可以从DictReader循环CSV的dict行。将这些dict转换为元组。不要使用循环,使用列表
[(行['users',行['highscores'])用于csv.DictReader(a)]
您将获得[(1,2)、(6,5)、(6,7)]
等
然后使用“lambda”这是一个可以传递到其他函数中的小函数,如sorted()
sorted()
处理传入的集合,例如上面的元组列表。而且,它需要一些非常有用的参数,其中至少有一个是排序的关键。因此,我们可以使用lambda来指定我们希望通过哪个键进行排序
sorted([(1,2)、(6,5)、(6,7)],key=lambda)
和lambda t:t[1]
表示返回每个元组的第二个元素(用户的高分)。因此,sorted()
按高分排序
然后通过列表切片,对结果进行切片,这是另一种非常酷的python方式[:3]
说给我前三个元素-从高到低排序会给你前三名的分数,以及他们的用户,因为你排序(…,reverse=True)
您可以访问结果元组列表,希望显示您希望制作/自动化的游戏的高分 TL;博士在这里。。。在底部,他明确表示他正在努力学习这个概念,所以他不想使用熊猫。这是做这项工作的正确工具。很公平。我将保留我的答案,因为它可能对未来的问题访客更有用,尽管如果他想走这条路线,他可以自由接受非熊猫的答案。为此,我取消了我的反对票,可能会投赞成票。实际上我有一个和这个想法有关的想法。为此,我将取消我的反对票,并实际提高你的答案,因为我同意熊猫是最好的解决方案。你必须使用听写器吗?行需要是字典吗?嘿,我终于可以评论了,谢谢!请更新您的问题,以反映您寻求的三个最高用户分数。您的代码似乎暗示了这一点,因为这正是您遇到困难的地方。但你的问题应该是明确的。下面给出了三个最高分的优秀答案,但对用户分数最高的用户表示尊敬,会使这个问题/答案对Python学习者更有价值。这是一个很好的完整答案!投票表决。我很感激你的解释。
score1 = 0
score2 = 0
score3 = 0
#score3 >= score2 >= score 1
for score in file:
if score > score3:
if score <= score2:
score1 = score
elif score <= score3:
score1 = score2
score2 = score
elif score > score3:
score1 = score2
score2 = score3
score3 = score