在Python中,sorted()
函数是一个非常有用的内置函数,用于对可迭代对象进行排序。下面是对sorted()
函数的全面解析,包括其用法、参数、返回值和实际应用示例。
用法
sorted()
函数的基本用法非常简单。它接受一个可迭代对象作为参数,并返回一个新的排序后的列表。平均情况时间复杂度:O(n log n)。
sorted_list = sorted(iterable, key, reverse) # 默认升序
参数
iterable:
任何可迭代对象,如列表、元组、字符串等。key:
一个函数,用于从每个元素中提取一个用于比较的值。如果不提供或者为None
,则比较元素本身。reverse:
如果为True
,则列表元素将被降序排列,默认为False
。
返回值
sorted()
函数返回一个已经排好序的新列表。
基本应用示例
1. 基本排序
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_numbers = sorted(numbers) # 默认升序
print(sorted_numbers) # 输出: [1, 1, 2, 3, 4, 5, 6, 9]
2. 字符串列表排序
words = ["banana", "apple", "cherry"]
sorted_words = sorted(words) # 按照字符串列表每个元素的首字母升序排序
print(sorted_words) # 输出: ['apple', 'banana', 'cherry']
3. 使用key参数排序
- 使用lambda表达式
numbers = [4, 1, 3, 2]
sorted_numbers = sorted(numbers, key=lambda x: -x) # 降序排序
print(sorted_numbers) # 输出:[4, 3, 2, 1]
这句代码是 sorted()
函数中的 key
参数的一个常见用法。让我们逐步分析这个 lambda
表达式:
-
key:
这是sorted()
函数中的一个参数,它接受一个函数,这个函数定义了排序的依据。key
函数的返回值将用于比较元素,从而决定元素在排序后的列表中的位置。 -
lambda:
这是 Python 中的一个关键字,用于创建匿名函数(即没有显式名称的函数)。lambda
表达式通常用于需要一个函数对象的地方,但又不想(或不需要)使用完整的def
语句定义一个函数。 -
x:
这是lambda
表达式中的参数,代表sorted()
函数处理的可迭代对象numbers中的单个元素。在排序过程中,x
会依次取遍历整个可迭代对象的所有元素。 -
::
这个冒号是lambda
表达式的结束标志,它后面的部分是表达式的主体。 -
-x:
这是lambda
表达式的主体,表示对输入参数x
进行取反操作。如果x
是一个数字,-x
就是它的负值。
综合来看,key=lambda x: -x
这个表达式的意思是:对于 sorted()
函数处理的可迭代对象中的每个元素 x
,使用其相反数 -x
作为排序的依据。因为 sorted()
函数默认是升序排序,所以当我们使用 -key
函数时,实际上是告诉 sorted()
函数根据元素的相反数进行降序排序。
例如,对于列表 [3, 1, 4, 2]
,如果我们使用 sorted()
函数并传入 key=lambda x: -x
,排序过程将会基于 -x
的值,即 [-3, -1, -4, -2]
,这将导致最终的排序结果为降序排列的 [4, 3, 2, 1]
。
- 使用内置函数名
key
用于接受一个函数,这个函数定义了排序的依据。因此除了lambda表达式,还可以直接使用 Python 的内置函数的函数名作为 key
。例如,len()
函数常用于根据字符串长度或列表大小进行排序。
words = ["banana", "apple", "cherry"]
sorted_words_by_length = sorted(words, key=len) # 根据字符串长度排序
print(sorted_words_by_length) # 输出: ['apple', 'banana', 'cherry']
4. 降序排序
reverse
如果为True
,则列表元素将被降序排列,默认为False
。
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_numbers_desc = sorted(numbers, reverse=True) # 降序排序
print(sorted_numbers_desc) # 输出: [9, 6, 5, 4, 3, 2, 1, 1]
5. 复杂数据排序
data = [
{'name': 'Alice', 'age': 34},
{'name': 'Bob', 'age': 41},
{'name': 'Charlie', 'age': 28},
{'name': 'David', 'age': 19}
]
sorted_data_by_age = sorted(data, key=lambda x: x['age']) # 根据字典中age的值排序
print(sorted_data_by_age) # 输出排序后的列表,按年龄升序排列