作者:手机用户2602926633_452 | 来源:互联网 | 2024-12-08 19:37
Python的sorted函数允许通过key参数自定义排序规则,key可以是函数、类或其他处理方式,用于处理需要比较的元素。本文将详细介绍key的工作原理及其应用。
Python的sorted
函数提供了一个灵活的方式来对数据进行排序,它接受三个参数:iterable
、key
和reverse
。
iterable
参数是一个可迭代对象,reverse
参数决定排序结果是否反转,而key
参数则用于定义排序的具体规则,可以是函数、类或其他处理逻辑。
key
的工作机制
key
参数的主要作用是对序列中的每个元素进行预处理,以确定其在排序中的位置。具体来说,sorted
函数会遍历序列中的每个元素,并使用key
指定的函数或方法对其进行处理,处理后的结果用于实际的比较。
如果key
是一个函数,通常返回一个简单的值,如整数或字符串。如果key
是一个类,则会调用该类的构造函数,生成一个对象,用于后续的比较。因此,作为key
的类必须有一个接受单个参数的构造函数。
使用内建函数或方法
使用内建函数或方法是最常见的做法。例如,我们可以使用str.lower
方法来忽略大小写进行排序:
ls = ["a", "b", "c", "D", "E"]
# 直接排序,结果为['D', 'E', 'a', 'b', 'c']
print(sorted(ls))
# 使用lower方法,结果为['a', 'b', 'c', 'D', 'E']
print(sorted(ls, key=str.lower))
使用自定义函数
除了内建函数,我们还可以定义自己的函数来实现特定的排序逻辑。例如,如果我们想根据数字的个位数进行排序,可以定义一个函数来提取个位数:
def gewei(num: int) -> int:
return num % 10
ls = [991, 86, 3]
# 结果为[991, 3, 86]
print(sorted(ls, key=gewei))
# 也可以使用lambda表达式,结果相同
print(sorted(ls, key=lambda num: num % 10))
使用类
如果key
参数是一个类,sorted
函数会将序列中的每个元素传递给该类的构造函数,生成一个对象。这些对象之间通过实现的__lt__
或__gt__
方法进行比较。
为了使类能够作为key
参数,类必须实现__lt__
或__gt__
方法。这两个方法分别表示“小于”和“大于”,对应的操作符为<
和>
。
关于__lt__
和__gt__
方法
__lt__
和__gt__
方法用于定义对象之间的比较规则。如果类中同时定义了这两个方法,它们将分别被<
和>
操作符调用。如果只定义了__lt__
方法,>
操作符也会调用__lt__
方法,但结果取反。
class Stu:
def __init__(self, name, age):
self.name = name
self.age = age
# 定义比较规则,年龄小的更小
def __lt__(self, other):
return self.age s1 = Stu("小明", 10)
s2 = Stu("小红", 12)
# 结果为True
print(s1
类作为key
参数
如果类要作为key
参数,其构造函数必须接受一个参数,用于接收序列中的元素。例如,我们可以定义一个类来根据年龄进行排序:
class Stu:
def __init__(self, age):
self.age = age
# 反向比较,年龄大的更小
def __lt__(self, other):
return self.age > other.age
ls = [10, 20, 11, 4, 9, 23]
# 结果为[23, 20, 11, 10, 9, 4]
print(sorted(ls, key=Stu))