【问题标题】:Python: leaderboardPython:排行榜
【发布时间】:2017-03-08 17:35:45
【问题描述】:

我被要求设计一个排行榜,

这是我试过的

def leader():

    file = open ("res.txt","r")
    reader = csv.reader(file)
    print (("{:20s}{:20s}{:20s}{:20s}".format("\nPlayer","Matches played","Won","Lost")))
    won = 100

    for r in reader:
        won = won-1
        if r[2] == str(won):
           print (("{:20s}{:20s}{:20s}{:20s}".format(r[0],r[1],r[2],r[3])))



    file.close()

我的 csv 文件如下所示

Leeroy,19,7,12
Jenkins,19,8,11
Tyler,19,0,19
Napoleon Wilson,19,7,12
Big Boss,19,7,12
Game Dude,19,5,14
Macho Man,19,3,16
Space Pirate,19,6,13
Billy Casper,19,7,12
Otacon,19,7,12
Big Brother,19,7,12
Ingsoc,19,5,14
Ripley,19,5,14
M'lady,19,4,15
Einstein100,19,8,11
Dennis,19,5,14
Esports,19,8,11
RNGesus,19,7,12
Kes,19,9,10
Magnitude,19,6,13

我希望它首先显示获胜最多的人,你能帮忙吗?

【问题讨论】:

  • 您可以尝试先以列表的形式将整个文件读入内存,然后使用适当的参数对其应用sorted()

标签: python file csv search


【解决方案1】:

尝试将文件添加到列表中:

all_rows = list(reader)

然后对大多数获胜的键上的所有行进行排序:

sorted_rows = sorted(all_rows, key=(lambda row: row[2]), reverse=True)

您可能想要堆叠多个排序,或者定义更复杂的键,以便您可以在相同的获胜次数内强制执行排序(例如,8 场比赛中的 7 场胜利优于 100 场比赛中的 7 场胜利)。

【讨论】:

  • key = lambda 有什么作用?
  • A lambda expression 基本上是一个内联函数定义。它创建一个函数,返回 lambda 关键字之后的任何表达式。
【解决方案2】:
keys = ["Player","Matches played","Won","Lost"]

# read file
with open("res.txt") as f:
    content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line and 
# split it by ',' then form a dictionary out of it 
content = [dict(zip(keys,x.strip().split(','))) for x in content]
# sort the above list of dicts in decreasing orde.
final_result = sorted(content, key=lambda k: k['Won'], reverse=True)

print final_result# sorted By score
# first element is the one with highest Won value
print final_result[0] # highest Won

【讨论】: