python3 sorted 如何实现自定义排序标准

1. 概述

Python内置的sorted()函数提供了一种方便的方法来对列表中的元素进行排序。可以通过传递一个关键字参数key来指定排序的方式。而当列表中的元素是自定义类型时,可以通过提供一个key函数来指定排序的规则。本篇文章将详细介绍如何实现自定义排序标准。

2. key函数

2.1 简介

当我们需要对列表中的元素进行排序时,key参数可以接收一个函数,该函数用来为每个元素提供排序依据。例如,如果我们有一个字符串列表,我们可以按字符串的长度对列表进行排序。使用key参数的排序方式是基于该函数返回值的大小进行排序的。

2.2 语法

下面是sorted函数的使用语法:

sorted(iterable[, key][, reverse])

其中一个比较关键的参数是key,它用来指定一个排序规则函数。

2.3 示例

下面的示例中,我们使用一个列表存储了一些学生的信息,然后按照年龄从小到大对学生信息列表进行排序。

students = [('Tom', 20), ('Lucy', 18), ('Jack', 22)]

def get_age(student):

return student[1]

sorted_students = sorted(students, key=get_age)

print(sorted_students)

输出结果如下:

[('Lucy', 18), ('Tom', 20), ('Jack', 22)]

在此示例中,我们定义了一个get_age函数,该函数用于获取学生年龄。然后在调用sort()函数时,将get_age函数作为key参数传递给sort()函数。

3. 自定义排序标准

3.1 简介

当需要对自定义类型的对象进行排序时,我们需要显示地指定排序规则,这可以通过定义一个key函数来实现。

3.2 示例

下面的示例中,我们定义了一个Person类,然后按照Person对象的年龄和名字进行排序。

class Person:

def __init__(self, name, age):

self.name = name

self.age = age

people = [Person('Tom', 20), Person('Lucy', 18), Person('Jack', 22)]

def get_sort_key(person):

return (person.age, person.name)

sorted_people = sorted(people, key=get_sort_key)

for person in sorted_people:

print(person.name, person.age)

输出结果如下:

Lucy 18

Tom 20

Jack 22

在此示例中,我们定义了一个Person类,它包含一个name属性和一个age属性。然后我们定义一个get_sort_key函数,用于返回一个元组,该元组包含了该Person对象的年龄和名字。在调用sort()函数时,将get_sort_key函数作为key参数传递给sort()函数,从而实现按照Person对象的年龄和名字进行排序。

3.3 复杂排序规则

在某些情况下,我们需要实现更为复杂的排序规则。比如,当需要对一个包含多个属性的对象进行排序时,我们需要指定多个排序规则。

下面的示例展示了如何在多个属性之间实现排序。我们使用namedtuple(命名元组)来存储歌手的信息,其中包括了歌手姓名、流行度和音乐类型,首先按照流行度降序排序,然后按照音乐类型升序排序,最后按照姓名升序排序。

from collections import namedtuple

Singer = namedtuple('Singer', ['name', 'popularity', 'music_type'])

singers = [Singer('Taylor Swift', 9, 'Pop'), Singer('Adele', 10, 'Blues'), Singer('Beyonce', 8, 'R&B')]

def get_sort_key(singer):

return (-singer.popularity, singer.music_type, singer.name)

sorted_singers = sorted(singers, key=get_sort_key)

for singer in sorted_singers:

print(singer.name, singer.popularity, singer.music_type)

输出结果如下:

Adele 10 Blues

Taylor Swift 9 Pop

Beyonce 8 R&B

在此示例中,我们使用namedtuple来表示歌手的信息,然后我们定义一个get_sort_key函数,用于返回一个元组。我们将元组的第一项设为负数,这样在使用sorted()函数进行排序时,就能够保证按照流行度进行降序排序。如果流行度相同,我们将按照音乐类型进行升序排序。最后,如果音乐类型也相同,我们将按照姓名升序排序。

3.4 lambda表达式排序规则

在定义一些简单的排序规则时,可以使用lambda表达式来代替定义一个独立的key函数。

下面的示例实现了一个对字符串按照长度进行排序的规则。

words = ['cat', 'bird', 'dog', 'elephant', 'ant']

sorted_words = sorted(words, key=lambda x: len(x))

print(sorted_words)

输出结果如下:

['ant', 'cat', 'dog', 'bird', 'elephant']

在此示例中,我们使用lambda表达式来定义了一个简单的排序规则,该规则按照字符串的长度来进行排序。

4. 结论

在本文中,我们介绍了如何使用Python的sorted()函数实现自定义排序标准。无论是简单的排序规则还是复杂的排序规则,都可以通过定义一个key函数来实现。此外,我们还介绍了如何使用lambda表达式来定义简单的排序规则。

后端开发标签