常见的排序方法与Python实现
在日常处理数据时,排序是再常见不过的操作。比如你有一堆学生的考试成绩,想按分数从高到低排列;或者需要把商品按价格升序展示。Python 提供了多种简单高效的排序方式,用起来非常顺手。
最基础也最常用的两种方法是 sort() 和 sorted()。虽然只差一个字母,但用法和效果略有不同。
原地排序:list.sort()
sort() 是列表对象自带的方法,直接修改原列表,不返回新列表。适合你不需要保留原始顺序的场景。
scores = [85, 91, 78, 96, 88]
scores.sort(reverse=True)
print(scores) # 输出:[96, 91, 88, 85, 78]这里 reverse=True 表示降序排列,如果设为 False 或省略,则默认升序。
生成新列表:sorted()
如果你希望保留原数据不变,只是得到一个排好序的新列表,sorted() 更合适。它适用于任何可迭代对象,不只是列表。
prices = (39, 19, 59, 29, 49) # 元组
sorted_prices = sorted(prices)
print(sorted_prices) # 输出:[19, 29, 39, 49, 59]
print(prices) # 原元组不变:(39, 19, 59, 29, 49)按自定义规则排序
有时候排序不能只看数值大小。比如你有一个学生名单,每个元素是包含姓名和成绩的元组,你想按成绩排序。
students = [('小明', 85), ('小红', 92), ('小亮', 78)]
students_sorted = sorted(students, key=lambda x: x[1], reverse=True)
print(students_sorted) # 输出:[('小红', 92), ('小明', 85), ('小亮', 78)]这里的 key 参数指定排序依据,lambda x: x[1] 表示按每个元组的第二个元素(成绩)排序。
也可以按字符串长度排序,比如整理一堆用户名:
names = ['Alice', 'Bob', 'Charlie', 'David']
sorted_names = sorted(names, key=len)
print(sorted_names) # 输出:['Bob', 'Alice', 'David', 'Charlie']使用 operator 模块简化操作
当处理更复杂的数据结构,比如字典列表时,可以借助 operator 模块中的 itemgetter 或 attrgetter。
from operator import itemgetter
products = [
{'name': '手机', 'price': 3999},
{'name': '耳机', 'price': 199},
{'name': '平板', 'price': 2999}
]
sorted_products = sorted(products, key=itemgetter('price'))
print(sorted_products)输出结果会按照价格由低到高排列,代码看起来也更清晰。