Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据csv中的列查找前三个最高的行?_Python_Python 3.x_Csv - Fatal编程技术网

Python 如何根据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

我试着遍历csv的每一行,并带回前三名的高分。只有两列,一列名为“用户”,另一列名为“高分”。我知道到目前为止我所拥有的并不多,但我完全被难住了。我觉得我可以通过存储值并迭代每一行来获得最高分数,如果它小于一个数字,则替换它,但如果我想要前三行,我不确定该怎么做

我是这样开始的:

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