(1)内置排序函数
(2)reversed操作
(3)扩展用法key
当我们要对一串数字或者字母,进行大小比较排序时,如果少数个我们可以自行排序,但是当数字多达几十个,甚至几百个时,人为排序就会使得效率低下,甚至有可能出错。内置函数sorted()就解决了这一问题。
内置排序函数
- sorted():是标准内置排序函数,按 < 关系排序。可用于所有序列或迭代器,该函数返回一个元素已排好的表,其中包含作为参数的序列或迭代器的所有元素。调用为表排序时,构造出的是另一个排好序的表,并不是在原列表上操作。
- list.sort():是表类型独有的操作,其功能与标准函数sorted()类似,但实际效果不同,sort()是在自身表里完成对元素的排序,并没有构造出新表。
实例解释:
#为表排序
>>>lst = [5, 3, 7, 0]
>>>print(sorted(lst))
[0, 3, 5, 7] #输出排好序的新表
#为元组排序
>>>tup = (5, 3, 7, 0)
>>>print(sorted(tup))
[0, 3, 5, 7] #同样输出排好序的表
#为字典排序
>>>dic = {'s':0, 'a':7}
>>>print(sorted(dic))
['a', 's'] #输出字典关键字的表,字母根据ASICC码进行排序,单词根据首字母以此往后比较
#表的sort()使用
>>>lst = [5, 3, 7, 0]
>>>lst.sort() #lst.sort()是对列表的操作,直接调用print(lst.sort()),返回None
>>>print(lst)
[5, 3, 7, 0] #调用print(lst)输出
注意:
- 当一个迭代对象中既包含字母,又包含数字时,无法进行排序,解释器报错。
TypeError: '<' not supported between instances of 'int' and 'str'。
- 对非列表对象调用sort,报AttributeError。
#例如元组 >>>tup = (3,5) >>>tup.sort() AttributeError: 'tuple' object has no attribute 'sort'
reversed操作
- reversed():标准的序列反转函数,可用于各种对象(不包括迭代器)。返回的是对象的一个反向迭代器,原对象并不改变。作为循环变量时,将按照原对象从后往前的顺序逐个得到元素。同时,reversed()只能用于变动序列
- list.reverse():其功能与标准函数reversed()类似,但实际上也是调整了list中元素的位置。
实例解释:
#反转列表
>>>lst = [5, 3, 7, 0]
>>>print(reversed(lst))
<list_reverseiterator object at 0x00000172ABFADB70>
##返回的是一个迭代器
>>>for i in reversed(lst):
print(i)
0
7
3
5
####其他序列情况类似,再次不一一展示
#使用reverse()进行反转
>>>print(lst.reverse())
None #类似于sort(),因为是操作,直接输出返回None
>>>lst.reverse()
>>>print(lst)
[0, 7, 3, 5]
#reverse + sort 使用
>>>lst.sort(reverse = True) #此时为 > 关系排序,默认为False
>>>print(lst)
[7, 5, 3, 0]
插在中间的小结:
- sorted 和 reversed 可以用于任何序列对象
- reverse操作只能用于可变序列对象
- sort操作只能用于表对象
扩展用法key
Python2.4之后,list.sort() 和 sorted() 都增加了 key 关键字参数用来进行在指定位置上的比较。
实例解释:
#二元组(k,v)关于v的 < 关系进行排序,再根据 k 的 > 关系进行排序
>>>s = [(3, 7), (5,0), (9,7), (4,1)]
>>>print(sorted(s, key = lambda x : (x[1], -x[0])))
[(5, 0), (4, 1), (9, 7), (3, 7)]
调用key的时候我们定义了一个lambda函数,他的使用过程是:
- 获取s中的一个元组作为实参调用
- x[1]表示改元组中下标为1的元素,即v
- x[0]类似,表示元组中小标为0的元素,即k
- 负号 - 表示按 > 关系排序
- x[1], -x[0] 的位置关系表示先将s中的所有元组按x[1]的 < 关系排序,再按x[0]的 > 关系排序
字典可以调用dic.item()转换成二元组使用,类似的三元组等都可以通过关键字key按指定位置上的元素排序。