关于自己理解的sort()函数中的key

本文详细介绍了如何使用Python中的sort函数对字典进行排序,并通过实例演示了如何按键和值进行升序或降序排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sort函数原型

sort(key=None, reverse=False)

key 可指定一些规则

reverse 默认值是False

可以给它赋值成True,那就是反向排序

Example:

当我们有一个需要排序的字典

它里面的键是一本小说所有的单词(不重复的,若是字典中出现重复的键,只会读取到最后一个键)

它里面的值是这本小说中所有单词出现的次数

Instance:

d = {
    'beautiful': 10,
    'wonderful': 12,
    'love':17
}

下面使用sort()对他进行排序

首先得先把他转化成一个列表:

content = list(d.items())

这下我们得到了一个列表,打印其中的内容发现得到了一个列表,其中存储的值是元组类型的。

[('beautiful', 10), ('wonderful', 12), ('love', 17)]

用键来排序:

content.sort(key=lambda x:x[0])

写成这个样子, x就是列表中的一个元组,x[0]就是元组中的第一个元素,也就是我们之前存储的键

打印一下:

[('beautiful', 10), ('love', 17), ('wonderful', 12)]

可以看出来按照每个键的首字母排序

用值来排序:

content.sort(key=lambda x:x[1])

写成这样就可以了,

打印一下:

[('beautiful', 10), ('wonderful', 12), ('love', 17)]

变成从小到大的值来排序

-。-

### Python 中 `sort` 函数的 `key` 参数用法详解 #### `key` 参数基本概念 在 Python 中,`list.sort()` 和内置函数 `sorted()` 都提供了 `key` 参数。`key` 是一个可选参数,它接收一个函数对象,该函数会被应用到列表中的每一个元素上,返回的结果将作为实际参与排序的值[^1]。 例如,如果有一个包含元组的列表,并希望按照元组的第二个元素进行排序,则可以使用 `operator.itemgetter` 或者 lambda 表达式来实现这一功能[^3]。 --- #### 示例代码展示 ##### 示例 1:按字符串长度排序 假设我们有一组字符串组成的列表,想要根据字符串的长度对其进行升序排列: ```python words = ["apple", "banana", "cherry", "date"] words.sort(key=len) print(words) # 输出: ['date', 'apple', 'banana', 'cherry'] ``` 这里,`len` 被作为一个简单的函数传递给 `key` 参数,表示基于每个字符串的实际长度来进行排序[^1]。 --- ##### 示例 2:按元组特定位置排序 对于由多个字段构成的数据结构(如元组),我们可以指定某个字段作为排序依据。下面的例子展示了如何根据元组的第二项进行降序排序: ```python data = [(1, 5), (2, 3), (3, 8)] from operator import itemgetter data.sort(key=itemgetter(1), reverse=True) print(data) # 输出: [(3, 8), (1, 5), (2, 3)] ``` 此处使用了来自 `operator` 模块的 `itemgetter` 方法,它可以高效地获取序列中固定索引处的内容作为排序键。 --- ##### 示例 3:复杂条件下的自定义排序 当默认的简单属性不足以满足需求时,可以通过编写更复杂的逻辑来定制排序行为。比如,先按年龄再按名字首字母顺序对学生记录进行整理: ```python students = [ {"name": "Alice", "age": 22}, {"name": "Bob", "age": 20}, {"name": "Charlie", "age": 22} ] # 先按 age 升序,若相等则按 name 字母序 students.sort(key=lambda student: (student["age"], student["name"])) print(students) # 输出 [{'name': 'Bob', 'age': 20}, {'name': 'Alice', 'age': 22}, {'name': 'Charlie', 'age': 22}] ``` 在这个例子中,lambda 表达式创建了一个复合键 `(student['age'], student['name'])` 来决定最终次序[^1]。 --- ##### 示例 4:模拟传统比较器的行为 尽管 Python 3 不再支持直接提供双参形式的比较器,但借助 `functools.cmp_to_key` 可以轻松完成迁移工作。考虑如下场景——我们需要让数值较大的数排前面: ```python import functools def custom_compare(a, b): if a > b: return -1 elif a < b: return 1 else: return 0 numbers = [5, 2, 9, 1] numbers.sort(key=functools.cmp_to_key(custom_compare)) print(numbers) # 输出: [9, 5, 2, 1] ``` 这段程序通过把原始的 compare function 封装进了 cmp_to_key 后赋给了 key 参数,从而实现了兼容性[^2]。 --- ### 总结 - `key` 参数的核心作用在于定义排序规则的具体细节。 - 它既可以是一个预置的标准库工具(如同 `str.lower`, `len` 等),也能够是你自己设计的小型辅助函数甚至是匿名表达式。 - 如果面对的是较为特殊的排序诉求,记得还有 `functools.cmp_to_key` 提供帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值