经典的Python函数之sorted()函数
Python 资深开发者都知道 sorted() 函数是 Python 内置函数中最常用的之一。它的作用是对可迭代对象进行排序(包括列表,元组,集合等)。本文将详细介绍 sorted() 函数的功能,使用方法和一些实用技巧。
## 基本使用方法
sorted() 函数的基本语法是:
sorted(iterable, key=None, reverse=False)
其中,iterable 表示要进行排序的迭代器,key 用于指定排序规则,reverse 用于指定排序方式(升序或降序)。
接下来我们将分别介绍这三个参数的作用。
### iterable
iterable 是需要排序的可迭代对象,常见的包括列表、元组、集合等。例如:
numbers = [3, 1, 4, 2, 5] sorted_numbers = sorted(numbers) print(sorted_numbers) # Output: [1, 2, 3, 4, 5]
sorted() 函数会将 numbers 列表中的元素按照升序排序,并返回一个新的列表 sorted_numbers,原列表 numbers 不会改变。
### key
key 参数用来指定排序规则,即按照什么方式来进行排序。其默认值为 None,表示使用每个元素的自然顺序进行排序。
我们可以自定义一个函数作为 key 参数传入,该函数会在排序时被调用,返回值作为排序的依据。
比如,下面这个示例中,我们定义了一组字符串列表,并通过 lambda 函数来指定按照字符串长度进行排序:
names = ['Jack', 'Lucy', 'Tomy', 'Jerry'] sorted_names = sorted(names, key=lambda x: len(x)) print(sorted_names) # Output: ['Jack', 'Lucy', 'Tomy', 'Jerry']
上面的代码中,我们将一个 lambda 函数作为 key 参数传递给 sorted() 函数,该函数接收字符串类型的参数 x,返回值为字符串的长度 len(x)。sorted() 函数在排序时会按照元素长度进行排序。
除了使用 lambda 函数,也可以自定义一个函数来作为 key 参数传入。下面这个例子中,我们定义了一个函数按照元素第二个字符进行排序:
def second_char(x):
return x[1]
words = ['apple', 'boy', 'cat', 'dog']
sorted_words = sorted(words, key=second_char)
print(sorted_words) # Output: ['cat', 'apple', 'boy', 'dog']
### reverse
reverse 参数用来指定排序的方式,其默认值为 False,表示按照升序排序。当设置为 True 时,将按照降序排序。
我们可以通过传递 reverse=True 参数来按照降序排序,例如:
numbers = [3, 1, 4, 2, 5] sorted_numbers_desc = sorted(numbers, reverse=True) print(sorted_numbers_desc) # Output: [5, 4, 3, 2, 1]
## sorted() 函数的返回值类型
sorted() 函数返回的是一个列表,该列表包含了按照指定排序规则排序后的所有元素。
如果需要将排序后的迭代器转换为其他类型的可迭代对象,可以使用内置函数 list()、tuple()、set()、dict() 等进行转换。
例如,使用 list() 将排序后的元素转换为列表:
numbers = [3, 1, 4, 2, 5] sorted_numbers = sorted(numbers) print(sorted_numbers) # Output: [1, 2, 3, 4, 5] sorted_numbers_list = list(sorted_numbers) print(sorted_numbers_list) # Output: [1, 2, 3, 4, 5]
同样的,我们也可以使用 tuple()、set() 等函数将排序结果转换为对应的类型。
## sorted() 函数与元组的比较
元组是 Python 中的一个重要数据结构,元组中的各个元素是有序的,且不可变。元组中的元素可以是任意类型,包括数字、字符串、元组等。
元组与列表的区别在于,元组是不可变的,一旦创建就无法修改。这意味着,元组中的元素无法排序。
幸运的是,Python 中的 sorted() 函数也可以对元组进行排序。实际上,sorted() 函数会将元组中的元素解包成列表并进行排序,最后再将结果打包成元组返回。
例如,下面这个例子中,我们定义了一个元组,并使用 sorted() 函数按照升序排序:
t = (3, 1, 4, 2) sorted_t = sorted(t) print(sorted_t) # Output: [1, 2, 3, 4]
注意,sorted() 函数返回的是一个列表,而不是元组。如果需要将排序结果转换为元组,可以使用内置函数 tuple() 进行转换。
## sorted() 函数的复杂度
sorted() 函数的时间复杂度为 O(n*log n),其中 n 表示要排序的元素个数。
该复杂度是由排序算法所决定的。Python 中的 sorted() 函数默认使用 Timsort 算法进行排序,该算法结合了归并排序和插入排序的优点,具有较好的平均复杂度和稳定性。
这里需要注意的是,在排序之前,sorted() 函数会对元素进行一次扫描,以确定元素的类型,并根据类型来选择合适的排序算法。这个过程的时间复杂度为 O(n),所以 sorted() 函数的总复杂度为 O(n*log n + n)。
## 总结
本文介绍了 Python 内置的 sorted() 函数的功能,使用方法和一些实用技巧。sorted() 函数是 Python 开发中最常用的函数之一,用于对可迭代对象进行排序。在使用 sorted() 函数时需要注意 key、reverse 等参数的使用,同时也需要注意时间复杂度的问题。
