Python基础(9)- 排序技巧

通常,我们排序的时候,我们可以使用系统内置的sorted函数或list自带的sort函数。
参考文章:http://www.jb51.net/article/57678.htm
https://docs.python.org/3/library/stdtypes.html?highlight=sort#list.sort

1. list.sort

sort(*, key=None, reverse=False)This method sorts the list in place, using only < comparisons between items. Exceptions are not suppressed - if any comparison operations fail, the entire sort operation will fail (and the list will likely be left in a partially modified state).

sort是就地排序

list1 = [66, 48, 28, 69, 86, 96, 89, 37, 56, 33]

list1
Out[93]: [66, 48, 28, 69, 86, 96, 89, 37, 56, 33]

list1.sort()

list1
Out[95]: [28, 33, 37, 48, 56, 66, 69, 86, 89, 96]

#默认是升序,可以使用reverse降序
list1.sort(reverse=True)

list1
Out[97]: [96, 89, 86, 69, 66, 56, 48, 37, 33, 28]

key可以传入一个函数,会作用于每一个element,返回值会作为排序键

key specifies a function of one argument that is used to extract a comparison key from each list element (for example, key=str.lower). The key corresponding to each item in the list is calculated once and then used for the entire sorting process. The default value of None means that list items are sorted directly without calculating a separate key value.

list2=list('AckjehLhct')

list2
Out[99]: ['A', 'c', 'k', 'j', 'e', 'h', 'L', 'h', 'c', 't']

list2.sort()

list2
Out[101]: ['A', 'L', 'c', 'c', 'e', 'h', 'h', 'j', 'k', 't']

list2.sort(key=str.lower)

list2
Out[103]: ['A', 'c', 'c', 'e', 'h', 'h', 'j', 'k', 'L', 't']

2. sorted

sorted(iterable, *, key=None, reverse=False)Return a new sorted list from the items in iterable

sorted是返回一个排序后的新list,使用方式基本一样,只是

list3 = [84, 57, 15, 84, 40, 37, 66, 45, 11, 95]

list3
Out[107]: [84, 57, 15, 84, 40, 37, 66, 45, 11, 95]

sorted(list3)
Out[108]: [11, 15, 37, 40, 45, 57, 66, 84, 84, 95]

sorted(list3,reverse=True)
Out[109]: [95, 84, 84, 66, 57, 45, 40, 37, 15, 11]

sorted方法对所有的可迭代对象都有效

sorted({3:'a',1:'z',5:'b',2:'c'})
Out[110]: [1, 2, 3, 5]

使用sorted还能对复杂对象进行排序

l_op=[('namei',20,'a'),('lufei',19,'c'),('qiaoba',15,'b')]

l_op
Out[112]: [('namei', 20, 'a'), ('lufei', 19, 'c'), ('qiaoba', 15, 'b')]

#默认是按照每一个tuple的第一个元素来排序的
sorted(l_op)
Out[113]: [('lufei', 19, 'c'), ('namei', 20, 'a'), ('qiaoba', 15, 'b')]


sorted(l_op,key=lambda x: x[0])
Out[114]: [('lufei', 19, 'c'), ('namei', 20, 'a'), ('qiaoba', 15, 'b')]

#我们可以通过key函数,来指定要使用的排序键,
sorted(l_op,key=lambda x: x[1])
Out[115]: [('qiaoba', 15, 'b'), ('lufei', 19, 'c'), ('namei', 20, 'a')]

sorted(l_op,key=lambda x: x[2],reverse=True)
Out[116]: [('lufei', 19, 'c'), ('qiaoba', 15, 'b'), ('namei', 20, 'a')]

sorted(l_op,key=lambda x: x[2])
Out[117]: [('namei', 20, 'a'), ('qiaoba', 15, 'b'), ('lufei', 19, 'c')]

对于自定义的对象也是可以的

class People:
    
    def __init__(self,id,name):
        self.id=id
        self.name=name
        

p1 = People(10,'lufei')
p2 = People(5,'namei')
p3 = People(15,'qiaoba')

#指定我们要排序的字段就行了
for p in sorted([p1,p2,p3],key=lambda p: p.id):
    print(p.id,p.name)

#out:
5 namei
10 lufei
15 qiaoba

for p in sorted([p1,p2,p3],key=lambda p: p.name):
    print(p.id,p.name)

#out:
10 lufei
5 namei
15 qiaoba
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容