Python 3.x的sort函数使用

本文讨论了Python 3.x中sort函数的变化,包括cmp参数的移除和如何使用functools.cmp_to_key进行转换。同时解释了sort函数的赋值问题,指出直接赋值会返回None,并提供了正确的赋值方法示例。
部署运行你感兴趣的模型镜像

问题一:cmp关键字,消失的cmp参数
arr = [5,4,3,2,1]
arr.sort(cmp = lambda x,y : x-y)
print(arr)
写完之后,竟然出现错误,难道是我晕了?

TypeError: 'cmp' is an invalid keyword argument for sort()
之后查看完文档,发现文档直接去掉了这个参数

def sort(self,*,key: Optional[(_T) -> Any] = …,reverse: bool = …) -> None
咱也不知道,咱也没法问,cmp参数就这样没了…
但是,凡事都有个但是,官方给咱了个 functools.cmp_to_key()

Use functools.cmp_to_key() to convert an old-style cmp function to a key function
直接上手使用

from functools import cmp_to_key

arr = [5,4,3,2,1]
arr.sort(cmp_to_key(lambda x,y : x-y))
print(arr)
唉呀妈呀,又直接报错

TypeError: sort() takes no positional arguments
欧!!!我实在是太粗心了,忘了再怎么改,也没有**cmp_to_key()**这个参数,我太慌了
所以,正确使用,记着以下两点:

记着导入>from functools import cmp_to_key
记着搭配>key=cmp_to_key(lambda x,y : x-y)
cmp 忘了它吧,下面放一个正确的实例:

from functools import cmp_to_key

nums = [1, 3, 2, 4]
nums.sort(key=cmp_to_key(lambda a, b: a - b))
print(nums)  # [1, 2, 3, 4]
问题二:两种不同的赋值,遇到的问题
还是直接上问题,不多说
间接赋值

x=[4,6,2,1,7,9]
x.sort()
y=x

print(y)  #[1, 2, 4, 6, 7, 9]
print(x)  #[1, 2, 4, 6, 7, 9]
直接复制

x=[4,6,2,1,7,9]
y=x.sort()

print(y)  #None
print(x)  #[1, 2, 4, 6, 7, 9]
仔细的哥们就发现,第二个y怎么返回的是None
明明我排序后,直接将排序后的地址给了y吗,怎么打印不出来呢????

还是上面的原因,我们太慌了,哎!!!!

print(type(y))
#
<class 'NoneType'>
发现它竟然是无效!!!,那么一定是sort()函数的问题,仔细看看

def sort(self,
         *,
         key: Optional[(_T) -> Any] = ...,
         reverse: bool = ...) -> None
注意::它返回的是一个None,是不是就跟之前的NoneType对应上了,大家这样可以了理解了吧

比如:

def len(o: Sized) -> int   #它就明显告诉你返回一个int
所以y=x.sort() 也忘掉它吧,赋值正确方法:

使用间接赋值
下面放一个实例:

from functools import cmp_to_key

def comp(x, y):
    if x < y:
        return 1
    elif x > y:
        return -1
    else:
        return 0

nums = [3, 2, 8, 0, 1]
nums.sort(key=cmp_to_key(comp))
tmp = nums
print(nums)  #[8, 3, 2, 1, 0]
print(tmp)     #[8, 3, 2, 1, 0]

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值