列表按字母顺序而非数字顺序排序

5

我已经积累了一份名单,其中包括每个人的用户名和其所获得分数。

接着我使用了以下代码将这些分数按降序排列。

winnerScore.sort()
winnerScore.reverse()

以下是打印列表“winnerScore”时的结果。
['j 78', 'j 36', 'i 90', 'i 58']

该函数根据用户名而不是实际代码进行了排序。
负责对列表进行排序的函数如下:
global winnerScore
with open("diceRoll.txt","r") as x_file:
    contents = x_file.readlines()

oneScore = contents[count-1]
oneScore = oneScore.split(" ")
print(oneScore)
n = oneScore[-2][-1] + " " + oneScore[-1]

winnerScore.append(n)

if len(oneScore) != 0:
    winnerScore.sort()
    winnerScore.reverse()

我已经从文本文件中读取了分数和用户名。
我该如何更改代码,以便根据用户名的实际分数对'winnerScore'列表进行排序?
4个回答

1
要按数字排序,您需要提取数字并将其视为 int,使用它作为排序键。像这样:
winnerScore = sorted(winnerScore, reverse=True, key=lambda x: int(x.split()[1]))

上述表达式将产生您期望的值:
winnerScore
=> ['i 90', 'j 78', 'i 58', 'j 36']

我添加了这个,这些是结果:['h 52','z 52','z 82','h 68'] - M. Ibtihaz Islam
1
对我来说,结果是['z 82', 'h 68', 'h 52', 'z 52']。希望你没有忘记再次分配变量;)检查我的更新答案。 - Óscar López
我一发完那条评论就意识到了错误。但现在它可以工作了 :) 感谢你的帮助! - M. Ibtihaz Islam
@M.IbtihazIslam 太棒了!请不要忘记接受最佳答案 ;) - Óscar López

1

默认情况下,字符串的排序顺序是按字母顺序排列的。

要自定义排序,可以添加key-function

以下是一个详细的示例:

>>> def extract_number(score):
        "Convert the string 'j 78' to the number 78"
        level, value = score.split()
        return int(value)

>>> scores = ['j 78', 'j 36', 'i 90', 'i 58']
>>> scores.sort(key=extract_number)
>>> scores
['j 36', 'i 58', 'j 78', 'i 90']

希望这有所帮助 :-)

0
你可以尝试这样做,按照分数对输入的元素进行排序。
x.sort(key= lambda i:i.split(' ')[-1], reverse=True)

其中x是包含输入的列表,姓名和分数之间用空格(' ')分隔

希望能对你有所帮助 xx


0

你可以在自定义的sort函数中使用正则表达式,这可能有助于处理字符串中有多个空格的情况:

import re
scores = ['j 78', 'j 36', 'i 90', 'i 58']

def get_score(username_score):
    score = re.search(r'\d+', username_score).group()
    return int(score)

scores.sort(key=get_score) 

输出:

['j 36', 'i 58', 'j 78', 'i 90']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接