按高分对名字进行排序

问题描述 投票:0回答:1

我想按分数对姓名列表进行排序。 到目前为止我所拥有的是

file = open("scores.txt", 'r')
for line in file:
    name = line.strip()
    print(name)
file.close()

我不确定如何对它们进行排序。

这是文件内容:

Matthew, 13
Luke, 6
John, 3
Bobba, 4

我想要的输出是:

John 3
Bobba 4
Luke 6
Matthew 13

有人可以帮忙吗?

python sorting python-3.x
1个回答
6
投票

您可以使用

.split(',')
方法将一条线分成单独的部分,然后使用
int()
将分数转换为数字。
.sort()
方法对列表进行就地排序,
key
告诉它按什么排序。

scores = []
with open("scores.txt") as f:
    for line in f:
        name, score = line.split(',')
        score = int(score)
        scores.append((name, score))

scores.sort(key=lambda s: s[1])

for name, score in scores:
    print(name, score)

这将为您提供一个包含按排序顺序的(名称,分数)对的元组列表。 如果您想打印它们并在它们之间添加逗号(以保持一致),请将打印更改为

print(name, score, sep=', ')

输入文件的读取也可以表示为一行(大)

with open("scores.txt") as f:
    scores = [(name, int(score)) for name, score in (line.split(',') for line in f)]

或使用 python 3.8+ 赋值表达式

with open("scores.txt") as f:
    scores = [((parts := line.split(','))[0], int(parts[1])) for line in f]

简单解释一下

key=

lambda 函数是匿名函数,即没有名称的函数。 通常,当您只需要一个函数来进行小操作时,您通常会使用它们。

.sort
有一个可选的
key
关键字参数,它接受一个函数并使用该函数的返回值来对对象进行排序。

所以这个

lambda
也可以写成

def ret_score(pair):
    return pair[1]

然后你可以写

.sort(key=ret_score)
但由于我们实际上并不需要该函数来做其他事情,所以没有必要声明它。 lambda 语法是

lambda <arguments> : <return value>

所以这个 lambda 接受一对,并返回其中的第二个元素。 如果您愿意,您可以保存

lambda
并像常规函数一样使用它。

>>> square = lambda x: x**2 # takes x, returns x squared
>>> square(3)
9
>>> square(6)
36
© www.soinside.com 2019 - 2024. All rights reserved.