Python中sorted函数的用法和排序技巧
sorted函数是Python内置的一个排序函数,它可以对列表、元组等可迭代对象进行排序。本文将详细介绍sorted函数的用法和排序技巧。
一、sorted函数的用法
1. 语法格式
sorted(iterable, reverse=False, key=None)
其中,iterable是要排序的可迭代对象;reverse是一个布尔值,用于决定排序是否降序,默认为False;key是一个可调用对象,用于从每个元素中提取一个用于比较的键值,默认为None。
2. 返回值
sorted函数返回一个新的按照指定方式排序的列表。
3. 使用示例
# 对列表进行升序排序
lst = [5, 2, 3, 1, 4]
res = sorted(lst)
print(res) # [1, 2, 3, 4, 5]
# 对列表进行降序排序
lst = [5, 2, 3, 1, 4]
res = sorted(lst, reverse=True)
print(res) # [5, 4, 3, 2, 1]
# 对字符串列表进行排序
lst = ['hello', 'world', 'python', 'java']
res = sorted(lst, key=len)
print(res) # ['java', 'hello', 'world', 'python']
# 对字典列表进行排序
lst = [{'name': 'Alice', 'age': 20}, {'name': 'Bob', 'age': 18}, {'name': 'Charlie', 'age': 22}]
res = sorted(lst, key=lambda x: x['age'])
print(res) # [{'name': 'Bob', 'age': 18}, {'name': 'Alice', 'age': 20}, {'name': 'Charlie', 'age': 22}]
二、排序技巧
1. 列表排序后保持原有顺序
有时候我们需要对列表进行排序,但又要保证原先相等的元素顺序不变。这时,可以传入一个自定义函数作为key参数,该函数返回元素的索引值。
# 列表排序后保持原有顺序
lst = [5, 2, 3, 1, 4, 3]
res = sorted(lst, key=lambda x: (x, lst.index(x)))
print(res) # [1, 2, 3, 3, 4, 5]
2. 对多个关键字进行排序
有时候我们需要对多个关键字进行排序,比如按照姓名和年龄依次排序。这时,可以传入一个元组作为key参数,元组中的每个元素表示一个排序关键字。
# 对多个关键字进行排序
lst = [{'name': 'Alice', 'age': 20}, {'name': 'Bob', 'age': 18}, {'name': 'Charlie', 'age': 22}]
res = sorted(lst, key=lambda x: (x['age'], x['name']))
print(res) # [{'name': 'Bob', 'age': 18}, {'name': 'Alice', 'age': 20}, {'name': 'Charlie', 'age': 22}]
3. 排序算法选择
sorted函数默认使用Timsort算法进行排序,它是一种融合了归并和插入排序思想的算法,适用于各种数据分布情况。但是,在某些情况下,需要根据数据分布情况选择不同的排序算法,比如插入排序适用于接近有序的数据,而快速排序适用于随机分布的数据。
# 排序算法选择
import random
import time
lst1 = list(range(10000))
lst2 = [random.randint(0, 10000) for i in range(10000)]
t1 = time.time()
sorted(lst1)
t2 = time.time()
print('耗时:', t2 - t1) # 耗时: 0.0009970664978027344
t1 = time.time()
sorted(lst2)
t2 = time.time()
print('耗时:', t2 - t1) # 耗时: 0.021930932998657227
4. 利用sorted函数进行去重
利用sorted函数可以对列表进行去重处理,即去除重复的元素,并将结果按照某种规则排序。
# 利用sorted函数进行去重
lst = [1, 3, 2, 4, 2, 1, 3]
res = sorted(set(lst), reverse=True)
print(res) # [4, 3, 2, 1]
5. 对列表进行稳定排序
稳定排序的含义是,对于列表中相同的元素,排序后它们之间的相对顺序不变。sorted函数默认使用Timsort算法进行排序,是一种稳定排序算法。但是,在某些情况下,需要使用其他稳定排序算法,比如归并排序。
# 对列表进行稳定排序
lst = [{'name': 'Bob', 'age': 18}, {'name': 'Alice', 'age': 20}, {'name': 'Charlie', 'age': 18}]
res = sorted(lst, key=lambda x: x['age'])
print(res) # [{'name': 'Bob', 'age': 18}, {'name': 'Charlie', 'age': 18}, {'name': 'Alice', 'age': 20}]
