我正在尝试遍历csv的每一行,并带回前3个高分。只有两列,一列名为“用户”,另一列为“高分”。我知道到目前为止我所获得的并不多,但是我完全陷入了困境。我觉得我可以通过存储该值并在每一行上进行迭代来获得最高分,如果它小于一个数字,则将其替换,但是我不确定如果想要前三行该怎么办。
这是我的开始方式:
import csv
a = open('highscoreslist.csv')
spreadsheet = csv.DictReader(a)
names = []
scores = []
for row in speadsheet:
names.append(row['users'])
scores.append(row['highscores'])
现在我只是不知道该朝哪个方向走。我打算将它们放在两个列表中,然后以这种方式找到最高的列表,但是它们已经在字典中,所以我毫无意义。我也在尝试学习这个概念,所以我不想在大熊猫中做。感谢您的提前帮助。
答案 0 :(得分:2)
这是一个非常适合pandas的任务,说实话,使用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
(这也是创建框架的方式):
In [32]: import pandas as pd
In [33]: import numpy as np
In [34]: df = pd.DataFrame.from_dict({'users': [chr(ord("A") + i) for i in range(10)],
...: 'highscores': np.random.randint(0, 100000, 10)})
In [35]: df.to_csv("highscoreslist.csv", index=False)
答案 1 :(得分:2)
您可以按高分对电子表格进行排序:
scores = sorted(scores, key=lambda row: row['highscores'], reverse=True)
现在,前三名的得分分别为scores[0]
,scores[1]
和scores[2]
我的回答不包括“ PANDAS”
答案 2 :(得分:0)
我做了与@Kristopher Ives类似的事情,通过将其保留为OrderedDict,您仍然可以拉出用户名。
scores = OrderedDict(sorted(spreadsheet.items(), key=lambda row:row[1]["highscores"]))
答案 3 :(得分:0)
使用collections.Counter
也很容易做到这一点。
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
答案 4 :(得分:0)
如果要在运行中进行操作,则可以按顺序存储前三个高分和相应的用户。在每次迭代中,检查新的higscore是否大于您所拥有的三个。如果大于三个中最小的一个,则更换它。如果它大于最大的,则替换第一个,然后向下移另外两个,依此类推。也许此伪代码使其更易于理解。
$oSpreadsheet->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
当然,您可以将用户保留在单独的变量中,并将它们与值一起更改。