当开发 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() 也支持 keyreverse 参数:

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() 函数。无论是简单的升降序排序,还是多键值或自定义排序,这些方法都可以帮助更高效地管理数据排序。


也可以看看