如何使用lambda对python列表进行排序

python list列表是编程经常会用到的数据结构。

这里示例使用 lambda 函数通过自定义的方式对Python列表进行排序。

all_candidates.sort(key=lambda x: x['score'], reverse=True)

key 参数:接受一个函数,该函数用于从每个元素中提取比较键

lambda 函数:匿名函数,适用于简单的排序逻辑

lambda 函数在排序中非常有用,特别是当需要根据元素的某个特定属性或复杂逻辑进行排序时。

1 基础排序示例

这里示例python list基础版本的升序排序和降序排序。

升序排序直接sort即可,降序排序在调用sort时,需要设置reverse=True。

示例代码如下所示

复制代码
# 对数字列表进行排序
numbers = [5, 2, 9, 1, 5, 6]

# 升序排序
numbers.sort()
print("升序排序:", numbers)  # [1, 2, 5, 5, 6, 9]

# 降序排序
numbers.sort(reverse=True)
print("降序排序:", numbers)  # [9, 6, 5, 5, 2, 1]

2 lambda版sort排序

这里示例使用 lambda函数作为sort调用的key参数进行排序。

目的是通过lambda函数自定义list中item用于排序的元素。

2.1 按绝对值排序

首先,不按元素数值本身进行排序,而是按绝对值进行排序,示例如下。

lambda表示取list中每个元素,然后选择元素中用于排序的比较键,示例如下

lambda x: abs(x),这里x为list中的元素,abs(x)表示x按绝对值参与排序。

示例代码如下所示。

复制代码
numbers = [-5, 2, -9, 1, -5, 6]

# 按绝对值大小排序
numbers.sort(key=lambda x: abs(x))
print("按绝对值排序:", numbers)  # [1, 2, -5, -5, 6, -9]

2.2 对字符串列表按长度排序

以下是按字符串长度进行排序的示例,包括升序排序和降序排序。

复制代码
words = ["apple", "banana", "cherry", "date", "elderberry"]

# 按字符串长度排序
words.sort(key=lambda x: len(x))
print("按长度排序:", words)  # ['date', 'apple', 'banana', 'cherry', 'elderberry']

# 按长度降序排序
words.sort(key=lambda x: len(x), reverse=True)
print("按长度降序排序:", words)  # ['elderberry', 'banana', 'cherry', 'apple', 'date']

2.3 对元组列表排序

参与排序的元素,可以不是字符串、数值等基本数据,也可以是复合数据,比如元组。

lambda很好的支持了这种情况,

lambda x: x[0]表示按元组的第1个数值作为比较键进行排序

lambda x: x[1]表示按元组的第2个数值作为比较键进行排序

示例代码如下所示

复制代码
students = [("Alice", 25), ("Bob", 19), ("Charlie", 22), ("David", 21)]

# 按年龄(第二个元素)排序
students.sort(key=lambda x: x[1])
print("按年龄排序:", students)  # [('Bob', 19), ('David', 21), ('Charlie', 22), ('Alice', 25)]

# 按姓名(第一个元素)排序
students.sort(key=lambda x: x[0])
print("按姓名排序:", students)  # [('Alice', 25), ('Bob', 19), ('Charlie', 22), ('David', 21)]

2.4 对字典列表排序

参与排序的数据元素,还可以是字典。

示例代码如下所示

复制代码
people = [
    {"name": "Alice", "age": 25, "city": "New York"},
    {"name": "Bob", "age": 19, "city": "Boston"},
    {"name": "Charlie", "age": 22, "city": "Chicago"},
    {"name": "David", "age": 21, "city": "Miami"}
]

# 按年龄排序
people.sort(key=lambda x: x["age"])
print("按年龄排序:")
for person in people:
    print(f"  {person['name']}: {person['age']}")

# 按城市名称排序(忽略大小写)
people.sort(key=lambda x: x["city"].lower())
print("\n按城市排序:")
for person in people:
    print(f"  {person['name']}: {person['city']}")

2.5 复杂排序逻辑

如果在一次排序中,需要进行多次排序。

比如先按成绩进行降序排,然后对于成绩相同的人,再按名字进行升序排。

在这种情况下,通过reverse参数设置可能无效,因为两次不都是升序或降序排列。

我们看看lambda如何实现这种复杂排序逻辑,示例如下。

key=lambda x: (-x[1], x[0]

这里x[1]表示成绩,使用负号表示实际案将序进行排列。

x[0]表示名字,表示成绩降序排列后,针对成绩相同的人,再按名字进行升序排列。

示例代码如下所示

复制代码
# 按多个条件排序:先按成绩降序,再按姓名升序
students = [
    ("Alice", 85),
    ("Bob", 92),
    ("Charlie", 85),
    ("David", 78),
    ("Eve", 92)
]

# 注意:使用负号实现降序,lambda返回元组实现多条件排序
students.sort(key=lambda x: (-x[1], x[0]))
print("按成绩降序,姓名升序排序:")
for name, score in students:
    print(f"  {name}: {score}")

2.6 使用 sorted() 函数

如果不能修改原始列表,还可以使用**sorted() 函数,**返回新排序列表。

示例代码如下所示。

复制代码
numbers = [5, 2, 9, 1, 5, 6]

# sorted() 返回新列表,不修改原列表
sorted_numbers = sorted(numbers, key=lambda x: x % 3)  # 按除以3的余数排序
print("原列表:", numbers)  # [5, 2, 9, 1, 5, 6]
print("按除以3的余数排序:", sorted_numbers)  # [9, 6, 5, 2, 1, 5]

2.7 对嵌套结构排序

另外,还可以按嵌套的方式分别进行排序。

复制代码
# 包含嵌套列表的排序
data = [
    ["apple", 3, 2.5],
    ["banana", 2, 1.8],
    ["cherry", 5, 3.2],
    ["date", 1, 4.0]
]

# 按第二个元素(数量)排序
data.sort(key=lambda x: x[1])
print("按数量排序:")
for item in data:
    print(f"  {item}")

# 按第三个元素(价格)排序
data.sort(key=lambda x: x[2])
print("\n按价格排序:")
for item in data:
    print(f"  {item}")

输出示例如下,

先按数据排序,输出一种结果

再按价格排序,输出另外一种新的排序结果。

按数量排序:

'date', 1, 4.0

'banana', 2, 1.8

'apple', 3, 2.5

'cherry', 5, 3.2

按价格排序:

'banana', 2, 1.8

'apple', 3, 2.5

'cherry', 5, 3.2

'date', 1, 4.0

2.8 自定义排序规则

另外,还可以自定义排序规则,

比如按字符串的最后一个字符排序,或者按字符串中特定字符的位置排序进行排序,示例如下。

复制代码
# 按字符串的最后一个字符排序
words = ["apple", "banana", "cherry", "date", "elderberry"]

words.sort(key=lambda x: x[-1])  # 取最后一个字符
print("按最后一个字符排序:", words)  # ['banana', 'apple', 'date', 'cherry', 'elderberry']

# 按字符串中特定字符的位置排序
words.sort(key=lambda x: x.find('a') if 'a' in x else len(x))
print("按字母'a'的位置排序:", words)

输出如下所示

按最后一个字符排序: ['banana', 'apple', 'date', 'cherry', 'elderberry']

按字母'a'的位置排序: ['apple', 'banana', 'date', 'cherry', 'elderberry']

reference


相关推荐
码界筑梦坊20 小时前
330-基于Python的社交媒体舆情监控系统
python·mysql·信息可视化·数据分析·django·毕业设计·echarts
森焱森20 小时前
详解 Spring Boot、Flask、Nginx、Redis、MySQL 的关系与协作
spring boot·redis·python·nginx·flask
he___H20 小时前
双色球红球
python
deephub20 小时前
机器学习特征工程:分类变量的数值化处理方法
python·机器学习·特征工程·分类变量
Dimpels20 小时前
CANN ops-nn 算子解读:AIGC 批量生成中的 Batch 处理与并行算子
开发语言·aigc·batch
blueSatchel20 小时前
U-Boot载入到DDR过程的代码分析
linux·开发语言·u-boot
Pyeako20 小时前
深度学习--卷积神经网络(下)
人工智能·python·深度学习·卷积神经网络·数据增强·保存最优模型·数据预处理dataset
无小道20 小时前
QT——QFIie和QFileInfo文件类
开发语言·qt·命令模式
OPEN-Source20 小时前
大模型实战:搭建一张“看得懂”的大模型应用可观测看板
人工智能·python·langchain·rag·deepseek
廖圣平20 小时前
从零开始,福袋直播间脚本研究【七】《添加分组和比特浏览器》
python