如何使用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


相关推荐
星辰徐哥2 小时前
Rust函数与流程控制——构建逻辑清晰的系统级程序
开发语言·后端·rust
葱明撅腚2 小时前
seaborn绘图(下)
python·matplotlib·可视化·seaborn·图表绘制
半路_出家ren2 小时前
3.python模拟勒索病毒
python·网络安全·密码学·网络攻击模型·base64·病毒·勒索病毒
jhf20203 小时前
2026汽车4S店GEO优化高性价比公司选型指南:从效果、成本到适配
python·汽车
叫我:松哥3 小时前
基于scrapy的网易云音乐数据采集与分析设计实现
python·信息可视化·数据分析·beautifulsoup·numpy·pandas
极智-9963 小时前
GitHub 热榜项目-日榜精选(2026-01-24)| AI智能体工具、Python生态等 | remotion、VibeVoice、goose等
人工智能·python·github·ai智能体·大模型部署·语音ai
java 乐山3 小时前
c 写一个文本浏览器(1)
c语言·开发语言
windows_63 小时前
MISRA C:2025 规则逐条分析
c语言·开发语言
YMLT花岗岩3 小时前
Python学习之-函数-入门训练-具有多个返回值的函数
python·学习