python sort详解_Python中sort以及sorted函数初探

Python中sort以及sorted函数初探:

sorted(...)

Help on built-in function sorted in module __builtin__:

sorted(...)

sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

sort(...)

Help on built-in function sort:

sort(...)

L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;

cmp(x, y) -> -1, 0, 1

sorted与sort的区别

1. sorted函数是内建函数,而sort是序列的内部函数,所以它们调用方式不一样,另外sorted函数多了一个系列迭代器参数

2. sorted函数不改变参数系列,但是返回排好序的序列副本;而sort作为序列的内部函数,调用完后会对调用的序列进行排序

下面的结果很好的说明了这些:

>>> list=[2,1]

>>> x=sorted(list)

>>> x

[1, 2]

>>> list

[2, 1]

>>> y=list.sort()

>>> y

>>> list

[1, 2]

sorted与sort的参数

sorted与sort除了一个是序列作为参数,一个是序列调用该函数,其他参数几乎完全一致,下面逐一来介绍其用法及效果:

1. 默认用法

由于sort函数的参数reverse,key,cmp都提供了缺省参数,所以我们可以直接不指定这些参数值调用该函数。但是它必须有一个前提,就是list中存放的类型是可比较的。否则就会弹出错误“Type Error: unorderable type"。

2. reverse参数

当取值为True时候就是倒序排,默认为False正序从小到大排

>>> list.sort(reverse=False)

>>> list

[1, 2]

>>> list.sort(reverse=True)

>>> list

[2, 1]

3. key参数

key表示用来做比较的值,这个主要对自定义的数据类型有用。下面用一个例子来诠释:

# Definition for an interval.

class Interval:

def __init__(self, s=0, e=0):

self.start = s

self.end = e

# Initialize the Interval list

list = []

for i in range(10,7,-1):

for j in range(11,i,-1):

list.append(Interval(i,j))

这里我们定义了Interval为[s,e]的数据结构并且初始化了。对于这个问题,显然我们用缺省的参数来调用会出错,因为我们没有提供可比较的函数来比较类型Interval。对于这样的情况,我们就可以指定比较的key来解决。

#Sort the Interval list

list2 = sorted(list,key=lambda x:x.start)

#Output the Interval list

for x in list:

print("[%d,%d]"%(x.start,x.end))

for x in list2:

print("[%d,%d]"%(x.start,x.end))

这里我们基于Interval.start作为key进行排序了。

可是接着问题来了,如果我不仅比较Interval.start,当Interval.start相等时候,还想比较Interval.end,该怎么办?

#Sort the Interval list based on Interval.start and Interval.end

list2 = sorted(list,key=lambda x:(x.start,x.end))

我们用元祖(Interval.start,Interval.end)作为key来比较,而元祖有默认的cmp函数。这就达到了目标。

4. cmp参数

我们可以通过自定义函数或则使用简洁的lambda来作为参数传给cmp

#Sort the Interval list based on Interval.start and Interval.end

def cmpInterval(a, b):

if a.start != b.start:

return cmp(a.start,b.start)

return cmp(a.end,b.end)

list1 = sorted(list,cmp = cmpInterval)

list2 = sorted(list,cmp = lambda x,y:cmp(x.start,y.start))

不过比较遗憾的是发现在python 3.x中传入cmp函数会出现一个错误:TypeError: 'cmp' is an invalid keyword argument for this function

这时候我们就需要使用key来绕过这个问题。另外一个建议就是我们尽量使用key而不是cmp来排序以提高运行速度。

Python 的详细介绍:请点这里

Python 的下载地址:请点这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值