当开发 Python 应用时,列表排序是一个常见需求,无论是对数字列表排序还是对字符串列表排序。本文将详细介绍在 Python 中如何灵活排序,包括基于键值、使用 lambda
表达式、自定义排序等不同需求场景。
什么是 Python 列表?
列表是 Python 内置的一种数据类型,可以存储多个数据值,包括整数、字符串,甚至嵌套列表或字典。以下示例展示了常见的列表类型:
# 数字列表
num_list = [3, 5, 1, 4, 2]
# 字符串列表
string_list = ["apple", "banana", "orange"]
# 混合数据类型列表
mixed_list = [1, "apple", ["banana", "orange"], 2]
Python 中的基本排序方法
在 Python 中可以通过 sort()
方法对列表进行排序。sort()
会直接修改列表,且支持升序和降序。使用语法如下:
list.sort(reverse=True|False, key=sort_function)
参数详解
reverse
:默认False
表示升序排序,True
表示降序排序。key
:可选参数,用于指定一个自定义排序的函数,方便对特定规则排序。
升序和降序排序示例
升序排序
使用 sort()
默认按升序排序,无需传入任何参数:
items = [10, 2, 8, 1, 5]
items.sort()
# 输出: [1, 2, 5, 8, 10]
降序排序
通过将 reverse=True
参数传递给 sort()
,即可实现降序排列:
items = [10, 2, 8, 1, 5]
items.sort(reverse=True)
# 输出: [10, 8, 5, 2, 1]
自定义排序函数示例:字典列表排序
若列表中的每个元素是一个字典,通过 key
参数可指定排序的键。以下示例展示如何按字典的 age
键排序:
items = [
{'name': 'John', 'age': 40},
{'name': 'Mike', 'age': 45},
{'name': 'Jane', 'age': 33},
{'name': 'Asa', 'age': 42}
]
# 自定义排序函数
def sort_fn(item):
return item['age']
items.sort(key=sort_fn)
# 输出: [{'name': 'Jane', 'age': 33}, {'name': 'John', 'age': 40}, {'name': 'Asa', 'age': 42}, {'name': 'Mike', 'age': 45}]
使用 lambda
表达式简化代码
在排序字典列表时,可使用 lambda
表达式简化代码:
items.sort(key=lambda item: item['age'], reverse=True)
# 输出: [{'name': 'Mike', 'age': 45}, {'name': 'Asa', 'age': 42}, {'name': 'John', 'age': 40}, {'name': 'Jane', 'age': 33}]
Python 中的 sorted()
方法
sorted()
不会更改原始列表,而是返回一个新列表。与 sort()
类似,sorted()
也支持 key
和 reverse
参数:
items = [5, 2, 9, 1, 7]
sorted_items = sorted(items)
# 原始列表未变,排序后新列表为 [1, 2, 5, 7, 9]
排序多键值的列表
如果需要按多个键值排序,可在 lambda
中传入多个键作为返回值:
items = [
{'name': 'John', 'age': 40, 'score': 85},
{'name': 'Mike', 'age': 45, 'score': 90},
{'name': 'Jane', 'age': 33, 'score': 95},
{'name': 'Asa', 'age': 42, 'score': 80}
]
# 先按 age 排序,再按 score 排序
items.sort(key=lambda item: (item['age'], item['score']), reverse=True)
常见排序应用案例
排序二维列表
Python 也可以轻松对二维列表按某一列排序。假设我们有如下二维列表,按第一个元素排序:
data = [
[3, "apple"],
[1, "banana"],
[2, "cherry"]
]
# 按第一个元素排序
data.sort(key=lambda x: x[0])
# 输出: [[1, 'banana'], [2, 'cherry'], [3, 'apple']]
去重排序
Python 中可以通过集合去重,然后排序列表:
items = [3, 5, 2, 2, 1, 3, 7]
unique_sorted_items = sorted(set(items))
# 输出: [1, 2, 3, 5, 7]
FAQ 常见问题
1. 如何在 Python 中对列表排序并保留索引?
可以使用 enumerate
来保留索引:
items = [4, 1, 3]
sorted_with_index = sorted(enumerate(items), key=lambda x: x[1])
# 输出: [(1, 1), (2, 3), (0, 4)]
2. 如何用 cmp
函数排序?
Python 3 不再支持 cmp
参数,但可以使用 functools.cmp_to_key
进行兼容:
from functools import cmp_to_key
def compare(x, y):
return x - y
items = [5, 2, 3]
sorted_items = sorted(items, key=cmp_to_key(compare))
# 输出: [2, 3, 5]
3. 如何按多个 key 对字典排序?
多个 key 排序需要用 lambda
表达式返回多个值:
items = [
{'name': 'Jane', 'age': 33, 'score': 92},
{'name': 'John', 'age': 40, 'score': 88},
{'name': 'Mike', 'age': 40, 'score': 90}
]
items.sort(key=lambda item: (item['age'], item['score']))
总结
本文详细介绍了在 Python 中对列表进行排序的各种方法,包括基础排序、字典列表排序、多键值排序、以及如何使用 lambda
表达式和 sorted()
函数。无论是简单的升降序排序,还是多键值或自定义排序,这些方法都可以帮助更高效地管理数据排序。