关于python:按第二个元素对列表排序

Sorting a list by the second element

本问题已经有最佳答案,请猛点这里访问。

我正在整理一个由名字和数字组成的列表,在这个例子中是一个人的名字和他们的保龄球得分。我想按字母和数字对列表进行排序。我很难弄清楚如何按数字排序。列表如下所示:"‘安,40’、‘杰夫,250’、‘赞恩,20’"。是否可以对列表中的第二个元素而不是第一个元素使用内置排序函数?

1
2
3
4
5
6
7
8
#Here is the code
l=['Ann, 40', 'Jeff, 250', 'Zane, 20']


l.sort(l[1])
for i in l:
    print(i)
#l.sort(l[1]) does not work

最终目标是显示

1
2
3
Jeff, 250
Ann, 40
Zane, 20

您可以使用键函数逆序排序,该键函数将每个输入字符串按,进行拆分,并在将其转换为整数后返回第二个项:

1
l.sort(key=lambda s: int(s.split(', ')[1]), reverse=True)

l变为:

1
['Jeff, 250', 'Ann, 40', 'Zane, 20']

对于我来说,更清洁的方法是:

首先创建一个类来处理对象,然后实现排序、gt和lt所需的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@dataclass
class Person:

    name: str
    value: int

    @classmethod
    def create_from_str(cls, string):
        name, value = string.split(",")
        return cls(name, int(value))

    def __gt__(self, other):
        return self.value > other.value

    def __lt__(self, other):
        return self.value < other.value

    def __repr__(self):
        return f"{self.name}, {self.value}"


l = ['Ann, 40', 'Jeff, 250', 'Zane, 20']

persons = [Person.create_from_str(string) for string in l]

persons.sort(reverse=True)

print("
"
.join(map(str, persons)))

# Jeff, 250
# Ann, 40
# Zane, 20


此方法提供您请求的输出。

1
2
3
4
5
6
7
8
l=['Ann, 40', 'Jeff, 250', 'Zane, 20']
l.sort(key = lambda x: int(x.split()[1]), reverse=True)
print(*l, sep = '
'
)
# outputs
Jeff, 250
Ann, 40
Zane, 20

这个方法短了一行,但它做的是相同的工作。

1
2
3
4
5
6
7
l=['Ann, 40', 'Jeff, 250', 'Zane, 20']
print(*sorted(l, key = lambda x: int(x.split()[1]), reverse=True),sep ="
"
)
# outputs
Jeff, 250
Ann, 40
Zane, 20

这里有一个关于使用*的参考资料,正如我在打印声明中所做的那样。


拆分列表并在将其转换为列表后对第二个元素排序

1
2
3
4
5
6
7
l=['Ann, 40', 'Jeff, 250', 'Zane, 20']
l.sort(key = lambda x: int(x.split()[1]), reverse=True)
for item in l:
    print(item)
#Jeff, 250
#Ann, 40
#Zane, 20