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)

 

posted on 2020-12-11 17:38  輪滑少年  阅读(2559)  评论(0编辑  收藏  举报