欢迎访问宙启技术站
智能推送

Python中的sorted()函数是如何使用的?如何自定义排序规则?

发布时间:2023-06-22 08:20:00

Python中的sorted()函数是一个非常有用的函数,用于将可迭代对象进行排序并返回一个排序好的列表。sorted()函数可以用于数值、字符串以及自定义对象。

sorted()函数的使用非常简单,只需要将需要排序的可迭代对象作为参数传入即可。例如,对于一个列表进行排序:

lst = [4, 1, 3, 5, 2]
sorted_lst = sorted(lst)
print(sorted_lst)  # 输出结果:[1, 2, 3, 4, 5]

sorted()函数默认按照升序排列,也可以通过reverse参数进行倒序排列:

lst = [4, 1, 3, 5, 2]
sorted_lst = sorted(lst, reverse=True)
print(sorted_lst)  # 输出结果:[5, 4, 3, 2, 1]

但是,对于自定义对象,sorted()函数默认无法进行排序。需要通过指定key参数来进行自定义排序。

首先,我们需要定义一个自定义排序函数,该函数的返回值是一个关键字,表示该对象在排序时按照该关键字进行排序。例如,我们定义一个Person类,通过name属性进行排序:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

def sort_by_name(person):
    return person.name

p1 = Person('Tom', 25)
p2 = Person('Jerry', 20)
p3 = Person('Alice', 30)

lst = [p1, p2, p3]
sorted_lst = sorted(lst, key=sort_by_name)
for p in sorted_lst:
    print(p.name, p.age)

输出结果为:

Alice 30
Jerry 20
Tom 25

在自定义排序函数中,我们返回了每个Person对象的name属性作为关键字。在调用sorted()函数时,通过指定key参数指向我们定义的自定义排序函数sort_by_name。

如果需要在自定义排序函数中指定多个关键字进行排序,可以返回一个元组,代表多个关键字。例如,我们定义一个新的自定义排序函数:

def sort_by_name_and_age(person):
    return person.name, person.age

sorted_lst = sorted(lst, key=sort_by_name_and_age)
for p in sorted_lst:
    print(p.name, p.age)

输出结果为:

Alice 30
Jerry 20
Tom 25

自定义排序函数sort_by_name_and_age返回了一个元组,包含两个关键字name和age。在调用sorted()函数时,同样也指定了key参数。

除了使用自定义函数外,还可以使用lambda表达式来进行自定义排序。例如,我们可以使用lambda表达式来定义一个按照年龄和姓名排序的规则:

sorted_lst = sorted(lst, key=lambda x: (x.age, x.name))
for p in sorted_lst:
    print(p.name, p.age)

输出结果为:

Jerry 20
Tom 25
Alice 30

lambda表达式返回了一个元组,包括两个关键字age和name,指定了按照age进行升序排列,如果年龄相同,则按照name进行升序排列。

总之,sorted()函数是一个强大的排序函数,不仅可以处理数值和字符串类型,还可以处理自定义对象。同时,可以通过指定key参数自定义排序规则,使得排序更加灵活和方便。