sort()函数与sorted()函数的区别
sort()是List对象的方法
sorted()只要是可迭代对象就可以,使用范围比sort()函数更广
List的sort()函数定义与用法:
Python源码builtins.py文件对sort()函数的定义如下
def sort(self, key=None, reverse=False): """ L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE* """ pass
可以看出:sort()函数没有返回值,有两个参数。key表示的是排依据的函数;reverse是指需不需要反转列表,默认为False表示的是升序,如果设为True表示的是降序。
sort()用法如下
L = [1, 2, 7, 4, 3] L.sort() print(L) #[1, 2, 3, 4, 7] 我们加入一些参数来看看,如降序排序: L = [1, 2, 7, 4, 3] L.sort(reverse=True) print(L) #[7, 4, 3, 2, 1] 通过key来实现降序排序,这里用到匿名函数lambda: L = [1, 2, 7, 4, 3] L.sort(key=lambda x : x*(-1)) print(L) #[7, 4, 3, 2, 1]
将key设为内置函数或者自定义函数,比如用绝对值函数:
L = [-1, 2, -7, 4, 3] L.sort(key=abs) print(L) #[-1, 2, 3, 4, -7]
Python3对key的还有另外一种支持,就是通过functools模块的cmp_to_key函数,将传统的cmp函数转为key。这和lambda函数用法类似,但是对于比较的逻辑比较复杂的情况,这样的方式会更清晰更便于维护。
from functools import cmp_to_key L = [-1, 2, -7, 4, 3] def cmp(a,b): if abs(a) < abs(b): return -1 else: return 1 L.sort(key=cmp_to_key(cmp)) print(L)
二.sorted()
官方文档
sorted(iterable,*,key = None,reverse = False ) 从iterable中的项目返回一个新的排序列表。 有两个可选参数,必须将其指定为关键字参数。 key指定一个参数的功能,该参数用于从iterable中的每个元素中提取一个比较键(例如key=str.lower)。默认值为None(直接比较元素)。 reverse是一个布尔值。如果设置为True,则对列表元素进行排序,就好像每个比较都被反转一样。 用functools.cmp_to_key()一个老式的转换CMP功能的 关键功能。 内置sorted()功能保证稳定。如果可以保证不更改比较相等的元素的相对顺序,则排序是稳定的-这有助于多次通过排序(例如,按部门排序,然后按薪级排序)。
sorted()返回值为List类型。参数列表iterable表示可迭代对象;*表示位置参数就此终结,后面的参数都必须用关键字来指定;key与reverse参数用法与sort()完全一致。
对字典进行value值排序(默认是通过key值排序)
Dict = {'a':2, 'b':3, 'c':7, 'd':4, 'e':1} L = sorted(Dict.items(), key=lambda x : x[1]) print(L) #[('e', 1), ('a', 2), ('b', 3), ('d', 4), ('c', 7)]
面试题:
对一个字符串进行统计,并且按照字符的数量依次排序
bbb='qqwwwwweredfdfhfgooooooooooo' #对bbb列表里的子字符进行排序 L = sorted(bbb) ll=[] dic={} count=0 for i in L: #每运行一次+1,统计运行次数 count += 1 #当ll列表内没有值时 if len(ll)==0: ll.append(i) #当i不再ll列表内时统计列表长度,并加入字典,然后清空,再将i加入列表 elif i not in ll: dic[ll[0]]=len(ll) ll.clear() ll.append(i) #当i再列表内时,并且count小于列表总长度 elif count<len(L): ll.append(i) #当i为列表内最后一个值 elif i == L[-1] and count==len(L): ll.append(i) dic[ll[0]] = len(ll) print(dic.items()) bbb=sorted(dic.items(),key=lambda x:x[1]) print(bbb)