Python中sort和sorted的区别和使用

一、函数介绍

sort函数和sorted函数的功能是非常强大的,在有些leetcode题目中,使用了这些函数,几行代码就可以

搞定了(只要你不怕被面试官打死),下面我们先看看这两个函数的介绍吧

>>> help(list.sort)
Help on method_descriptor:
sort(self, /, *, key=None, reverse=False)
    Stable sort *IN PLACE*.      #inplace
    
>>> help(sorted)
Help on built-in function sorted in module builtins:
sorted(iterable, /, *, key=None, reverse=False)
    Return a new list containing all items from the iterable in ascending order.  #new list
    A custom key function can be supplied to customize the sort order, and the
    reverse flag can be set to request the result in descending order.

抓住最主要的关键词就可以看出区别了,sort()是在原位重新排列列表、sorted()是产生新列表

二、函数的主要功能

sort()方法的语法:sort(cmp = None,reverse = False),注意只有列表才有sort()方法

主要的参数含义如下:

  • key : 主要用来比较的元素,只有一个参数(取自于可迭代的对象)

  • reverse : 是排序的规则,reverse = True是降序的,reverse = False升序(默认)

sorted()方法的语法:sorted(iterable,cmp = None,key = None,reverse = False)

其中key参数和reverse参数与sort()相同,其他参数含义如下,任何可迭代的类型均可使用sorted()

  • iterable: 是可迭代的数据类型

  • cmp : 用于比较的函数,比较什么由key决定,有默认值,是迭代集合中的一项,cmp和key可以使用lambda

  • 返回值:函数的返回值是一个经过排序的可迭代类型,与iterable一样

三、基本使用

默认情况下sort()和sorted()函数会优先排序第一个元素,然后再排序第二个元素;大写字母会排在

小写字母的前面,默认是按照从小到大的顺序进行排列

1.sort函数的使用

#获取列表中的第二个元素
def takeSecond(element):
    return element[1]
#元素为元组的列表
random = [(2,3),(4,5),(4,3)]
random.sort(key = takeSecond)  #指定第二个元素进行排序

2.sorted()函数的使用

#Sorted cmp
random = [('b',3),('a',5),('d',3),('c',2)]
sorted(random,cmp = lambda x,y:cmp(x[1],y[1])) #先按照每个元组的第二个元素排序,再按照第一个元素排序

#Sorted key
random = [('b',3),('a',5),('d',3),('c',2)]
sorted(random,key = lambda x:x[1])  #对列表中每个元组的第二个元素排序
sorted(random,key = lambda x:(x[1],x[0])) #先按照每个元组的第二个元素排序,再按照第一个元素排序

#在效率上,key>cmp

#更加高级的排序结构,当列表中元素是字典时
message = [{'name':'yzz','age':18},{'name':'zjn','age':20},{'name':'ldd','age':19}]
sorted(message,key = lambda x : (x['name'],x['age']))  #对于每一个字典,先按照name,再按照age进行排序
sorted(message,key = lambda x : (x['name'],-x['age']))  #对age进行逆序排序

#使用sorted()函数对字典的key或者value进行排序
dic = {'yzz':45,'cxx':23,'xvv':90}
sorted(dic.keys())  #对字典的键进行排序
sorted(dic.values())  #对字典中所有的值排序
sorted(dic.items()) #将字典转化为可迭代对象,iterms()方法将字典的元素转换成元组,排序后为列表

四、其他数据类型的排序

在python的基本数据类型中,只有列表和元组是有序的,字典和集合都是无序的,但是在一些扩展的库中

也提供了有序的集合或者字典

1.增强的集合

pydu的set模块中,有OrderedSet() 可以保持插入元素是有序的集合

from pydu.set import OrderedSet

origin = {2,3,4,5,2,1,"ddf"}
origin.add(5)
origin.add(6)
origin.add(90)
origin.add(29384)
print(origin)   #每次运行的结果顺序不同

new = OrderedSet([3,4,5,7,1,"r45454"])  
new.add(289)
new.add(9898)
new.add(889379)
print(list(new))   #每次运行的结果顺序相同

2.字典到底是有序的还是无序的?

Python 3.6改写了dict的内部算法,使得dict是有序的,在此版本之前均是无需的,在之前的话可以通过

使用Collections库中的orderDict来保证插入的元素是有序的