列表按字母顺序排序,而不是按数字顺序排序

时间:2020-01-28 22:05:23

标签: python arrays list

我已经积累了一份分数列表,其中列出了达到该特定分数的人的用户名。

然后我使用下面的代码按降序排列分数。

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 个答案:

答案 0 :(得分:1)

要按数字排序,您需要提取数字并将其用作int,并将其用作排序键。像这样:

winnerScore = sorted(winnerScore, reverse=True, key=lambda x: int(x.split()[1]))

上面的表达式将产生您期望的值:

winnerScore
=> ['i 90', 'j 78', 'i 58', 'j 36']

答案 1 :(得分: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']

希望这会有所帮助:-)

答案 2 :(得分:1)

您可以尝试类似的操作,根据得分对输入元素进行排序

x.sort(key= lambda i:i.split(' ')[-1], reverse=True)

其中x是包含输入的列表,名称和分数由空格('')

分隔

希望它对xx有帮助

答案 3 :(得分: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']