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']