Python的sort函数和sorted、lambda和cmp

本文介绍了Python中两种常用的排序方法:sort()和sorted(),并对比了它们的区别及应用场景。此外,还详细讲解了Lambda表达式的使用方法,包括如何在排序函数中应用Lambda表达式。

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

1、sort和sorted

我们需要对List进行排序,Python提供了两个方法

对给定的List L进行排序,
方法1.用List的成员函数sort进行排序

方法2.用built-in函数sorted进行排序(从2.4开始)

iterable:是可迭代类型;
cmp:用于比较的函数,比较什么由key决定,有默认值,迭代集合中的一项;
key:用列表元素的某个属性和函数进行作为关键字,有默认值,迭代集合中的一项;
reverse:排序规则. reverse = True 或者 reverse = False,有默认值。
返回值:是一个经过排序的可迭代类型,与iterable一样。
 
注;一般来说,cmp和key可以使用lambda表达式

sort()与sorted()的不同在于,sort是在原位重新排列列表,而sorted()是产生一个新的列表。

Sorting basic:

>>> print sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]
>>> L = [5, 2, 3, 1, 4]
>>> L.sort()
>>> print L
[1, 2, 3, 4, 5]

Sorting  cmp:

>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>print sorted(L,cmp=lambda x,y:cmp(x[1],y[1]))
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

Sorting  keys:

>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>print sorted(L, key=lambda x:x[1]))
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

Sorting  reverse:

>>> print sorted([5, 2, 3, 1, 4], reverse=True)
[5, 4, 3, 2, 1]
>>> print sorted([5, 2, 3, 1, 4], reverse=False)
[1, 2, 3, 4, 5]
注:效率key>cmp(key比cmp快)
在Sorting Keys中:我们看到,此时排序过的L是仅仅按照第二个关键字来排的,如果我们想用第二个关键字
排过序后再用第一个关键字进行排序呢?
>>> L = [('d',2),('a',4),('b',3),('c',2)]
>>> print sorted(L, key=lambda x:(x[1],x[0]))
>>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]


2、lambda表达式

lambda只是一个表达式,函数体比def简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda表达式是起到一个函数速写的作用。允许在代码内嵌入一个函数的定义。
如下例子:


定义了一个lambda表达式,求三个数的和。

再看一个例子:

用lambda表达式求n的阶乘。


lambda表达式也可以用在def函数中。

这里定义了一个action函数,返回了一个lambda表达式。其中lambda表达式获取到了上层def作用域的变量名x的值。

a是action函数的返回值,a(22),即是调用了action返回的lambda表达式。

这里也可以把def直接写成lambda形式。如下




### Python 中 `sort` 方法与 `sorted` 函数的区别 #### 定义与作用范围 `sort()` 是列表对象的一个方法,仅能应用于列表类型的对象。此方法会直接修改原始列表并对其进行排序[^1]。 ```python example_list = [5, 2, 9, 1] example_list.sort() print(example_list) # 输出: [1, 2, 5, 9] ``` 相反,`sorted()` 是一个内置函数,可以接受任何可迭代对象作为输入参数,并返回一个新的已排序列表而不影响原有的数据结构[^3]。 ```python original_tuple = (7, 3, 5, 8) new_sorted_list = sorted(original_tuple) print(new_sorted_list) # 输出: [3, 5, 7, 8] print(original_tuple) # 原始元组保持不变: (7, 3, 5, 8) ``` #### 参数设置 两者都支持相同的两个主要参数:`key` `reverse`。其中: - `key`: 指定一个单参函数用来提取比较键。 - `reverse`: 如果设为 True 则表示降序排列,默认情况下是升序(False)[^4]。 对于更复杂的排序需求,比如按照对象属性排序时,可以利用 `operator.attrgetter` 或者自定义 lambda 表达式来实现特定字段上的排序逻辑[^4]。 ```python from operator import attrgetter class Student: def __init__(self, name, age): self.name = name self.age = age students = [ Student("Alice", 20), Student("Bob", 22), Student("Charlie", 19) ] by_age_ascending = sorted(students, key=attrgetter('age')) for student in by_age_ascending: print(f"{student.name}: {student.age}") # Charlie: 19 Alice: 20 Bob: 22 ``` 需要注意的是,在较新的 Python 版本中已经不再支持通过 cmp 参数来进行定制化比较的行为,而是推荐使用上述提到的方式完成复杂条件下的排序任务[^2]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值