### Python3 `sort()` 和 `sorted()` 函数详解
在Python编程中,对数据进行排序是非常常见的需求之一。本文将详细介绍Python3中的两种主要排序方法:`sort()` 和 `sorted()`,并提供丰富的示例来帮助理解这两种方法的用法。
#### 1. `sort()` 方法
`sort()` 是列表(list)对象的一个方法,它直接作用于原列表上,改变其顺序,而不是返回一个新的排序后的列表。这意味着如果你有一个列表,并且想要排序它,那么你可以直接调用该列表的 `sort()` 方法。
**语法**:
```python
list.sort(key=None, reverse=False)
```
- **key**: 接受一个函数作为参数,此函数将被用于从每个元素中提取一个比较的关键字。
- **reverse**: 布尔值,如果设置为 `True`,则列表元素会被倒序排列;默认情况下为 `False`,即按升序排列。
**示例**:
```python
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
students.sort(key=lambda x: x[2])
print(students) # 输出: [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
```
在这个例子中,我们使用了一个匿名函数(lambda 表达式)作为 key 参数,根据学生年龄对列表进行排序。
#### 2. `sorted()` 函数
与 `sort()` 不同,`sorted()` 是一个内置函数,可以对任何可迭代的对象(如列表、元组、字符串等)进行排序,并返回一个新的已排序的列表,而不会修改原始数据。
**语法**:
```python
sorted(iterable, key=None, reverse=False)
```
- **iterable**: 任何可迭代的对象。
- **key**: 同 `sort()` 中的 key,用于指定排序依据。
- **reverse**: 同 `sort()` 中的 reverse,控制排序方向。
**示例**:
```python
s = 'asdf234GDSdsf23'
sorted_s = sorted(s, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x))
print("".join(sorted_s)) # 输出: addffssDGS33224
```
这里通过一系列条件判断,实现了小写 < 大写 < 奇数 < 偶数的排序规则。
#### 3. 使用 `key` 参数
`key` 参数是 `sort()` 和 `sorted()` 最强大的特性之一,它允许开发者自定义排序规则。`key` 参数期望一个函数,该函数应该接受单个输入参数,并返回一个用于排序的标准值。
**示例**:
```python
list1 = [7, -8, 5, 4, 0, -2, -5]
sorted_list = sorted(list1, key=lambda x: (x < 0, abs(x)))
print(sorted_list) # 输出: [7, 5, 4, 0, -2, -5, -8]
```
在这个例子中,我们首先根据数字是否为负数进行排序,然后对于负数部分,我们按照它们绝对值的大小排序。
#### 4. 总结
通过上述介绍和示例,我们可以看到 `sort()` 和 `sorted()` 的强大之处在于它们的灵活性以及通过 `key` 参数自定义排序规则的能力。这些功能使得在Python中处理各种排序问题变得非常简单高效。
在实际应用中,选择使用哪种方法取决于具体情况:
- 如果需要对现有列表进行就地排序,并且不关心原始列表的顺序,则应使用 `list.sort()`。
- 如果需要保留原始数据不变,并获得一个新排序后的列表,则应使用 `sorted()` 函数。
无论是哪种情况,正确地利用 `key` 参数都将极大地提高你的排序效率和代码的可读性。希望这篇文章能帮助你在未来的工作中更好地使用这两个函数。