Python中sort与sorted函数

Python中sort与sorted函数python中列表的内置函数sort()可以对列表中的元素进行排序,而全局性的sorted()函数则对所有可迭代的序列都是适用的;并且sort()函数是内置函数,会改变当前对象,而sorted()函数只会返回一个排序后的当前对象的副本,而不会改变当前对象。sort原型:sort(fun,key,reverse=False)参数fun是表明此sort函数是基于何种算法进行排序的,一般默认情况…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

python中列表的内置函数sort()可以对列表中的元素进行排序,而全局性的sorted()函数则对所有可迭代的序列都是适用的;

并且sort()函数是内置函数,会改变当前对象,而sorted()函数只会返回一个排序后的当前对象的副本,而不会改变当前对象。

sort

原型:sort(fun,key,reverse=False)

参数fun是表明此sort函数是基于何种算法进行排序的,一般默认情况下python中用的是归并排序,并且一般情况下我们是不会重写此参数的,所以基本可以忽略;

参数key用来指定一个函数,此函数在每次元素比较时被调用,此函数代表排序的规则,也就是你按照什么规则对你的序列进行排序;

参数reverse是用来表明是否逆序,默认的False情况下是按照升序的规则进行排序的,当reverse=True时,便会按照降序进行排序。

#coding:utf-8 
from operator import attrgetter,itemgetter  
  
list1 = [(2,'huan',23),(12,'the',14),(23,'liu',90)]  
  
#使用默认参数进行排序,即按照元组中第一个元素进行排序 
list1.sort()  
print list1  
#输出结果为[(2, 'huan', 23), (12, 'the', 14), (23, 'liu', 90)] 
  
#使用匿名表达式重写key所代表的函数,按照元组的第二个元素进行排序 
list1.sort(key=lambda x:(x[1]))  
print list1  
#[(2, 'huan', 23), (23, 'liu', 90), (12, 'the', 14)] 
  
#使用匿名表达式重写key所代表的函数,按照元组的第三个元素进行排序 
list1.sort(key=lambda x:(x[2]))  
print list1  
#[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)] 
  
#使用匿名函数重写key所代表的函数,先按照元组中下标为2的进行排序, 
# 对于下标2处元素相同的,则按下标为0处的元素进行排序 
list1.sort(key=lambda x:(x[2],x[0]))  
print list1  
#[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)] 
  
#使用operator模块中的itemgetter函数进行重写key所代表的函数,按照下标为1处的元素进行排序 
list1.sort(key=itemgetter(1))  
print list1  
#[(2, 'huan', 23), (23, 'liu', 90), (12, 'the', 14)] 
  
#使用operator模块中的itemgetter函数进行重写key所代表的函数,按照下标为2处的元素进行排序 
list1.sort(key=itemgetter(2))  
print list1  
# [(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)] 
  
# 此处可以类比lambda中的排序方法,就不再解释 
list1.sort(key=itemgetter(2,0))  
print list1  
#[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]

Jetbrains全家桶1年46,售后保障稳定

sorted

原型sorted(iterable, cmp=None, key=None, reverse=False)

对于sorted()函数中key的重写,和sort()函数中是一样的,所以刚刚对于sort()中讲解的方法,都是适用于sorted()函数中

cmp函数:

''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! '''
# 排序算法: 
# 排序也是在程序中经常用到的算法。 
# 无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。 
# 如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。 
# 通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1, 
# 这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序 
  
# Python内置的sorted()函数就可以对list进行排序: 
print(sorted([34, 5, 7, 2, 8, 13]))  
  
print('-----------------------------------------------------------------------------------')  
  
# sorted()函数也是一个高阶函数,它还可以接收一个比较函数来实现自定义的排序。 
# 比如,如果要倒序排序,我们就可以自定义一个reversed_self函数 
# 传入自定义的比较函数reversed_self,就可以实现倒序排序 
def reversed_self(x, y):  
    if x > y:  
        return -1  
    if x < y:  
        return 1  
    return 0  
res = sorted([34, 5, 7, 2, 8, 13], reversed_self)  
print(res)  
  
print('-----------------------------------------------------------------------------------')  
  
# 默认情况下,对字符串排序,是按照ASCII的大小比较的,由于'Z' < 'a',结果,大写字母Z会排在小写字母a的前面。 
# 现在,我们提出排序应该忽略大小写,按照字母序排序。要实现这个算法,不必对现有代码大加改动,只要我们能定义出忽略大小写的比较算法就可以 
# Python upper() 方法将字符串中的小写字母转为大写字母。 
def ignore_case(x1, x2):  
    u1 = x1.upper()  
    u2 = x2.upper()  
    if u1 < u2:  
        return -1  
    if u1 > u2:  
        return 1  
    return 0  
# 忽略大小写来比较两个字符串,实际上就是先把字符串都变成大写(或者都变成小写),再比较 
res1 = sorted(['bob', 'about', 'Zoo', 'Credit'], ignore_case)  
print(res1)

sort与sorted函数比较

sorted() 作用于任意可迭代的对象,而 sort() 一般作用于列 表。

因此下面的例子中针对元组使用 sort() 方法会抛出 AttributeError,而使用 sorted() 函数则 没有这个问题。

>>> a = (1,2,4,2,3)
>>> a.sort()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'sort'
>>> sorted(a)
[1, 2, 2, 3, 4]

当排序对象为列表的时候两者适合的场景不同。sorted() 函数会返回一个排序后的列表,原有列表保持不 变;而 sort() 函数会直接修改原有列表,函数返回为 None。

''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! '''
>>> a=['1',1,'a',3,7,'n']
>>> sorted(a)
[1, 3, 7, '1', 'a', 'n']
>>> a
['1', 1, 'a', 3, 7, 'n']
>>> print a.sort()
None
>>> a
[1, 3, 7, '1', 'a', 'n']

因此如果实际应用过程中需要保留原有列表,使用 sorted() 函数较为适合,否则可以选 择 sort() 函数,因为 sort() 函数不需要复制原有列表,消耗的内存较少,效率也较高。

无论是 sort() 还是 sorted() 函数,传入参数 key 比传入参数 cmp 效率要高。cmp 传入 的函数在整个排序过程中会调用多次,函数开销较大;而 key 针对每个元素仅作一次处理, 因此使用 key 比使用 cmp 效率要高。

sorted的强大功能

对字典进行排序(中根据字典的值进行排序)

>>> phonebook = { 
   'Linda': '7750', 'Bob': '9345', 'Carol': '5834'}
>>> from operator import itemgetter
>>> sorted_pb = sorted(phonebook.iteritems(),key=itemgetter(1))
>>> print sorted_pb
[('Carol', '5834'), ('Linda', '7750'), ('Bob', '9345')]

ps: iteritems()方法返回字典的迭代器对象。 operator.itemgetter()函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号)。看例子

''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! '''
a = [1,2,3] 
>>> b=operator.itemgetter(1)      //定义函数b,获取对象的第1个域的值
>>> b(a) 

>>> b=operator.itemgetter(1,0)  //定义函数b,获取对象的第1个域和第0个的值
>>> b(a) 
(2, 1)

要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。

多维list排序

实际情况下也会碰到需要对多个字段进行排序的情况,如根据学生的成绩、对应的等级依次排序。当然这在 DB 里面用 SQL 语句很容易做到,但使用多维列表联合 sorted() 函数也可以轻易达到类似的效果。

>>> from operator import itemgetter
>>> gameresult = [['Bob',95.00,'A'],['Alan',86.0,'C'['Mandy',82.5,'A'],['Rob',86,'E']] # 分别表示学生的姓名,成绩,等级
>>> sorted(gameresult , key=operator.itemgetter(2, 1))
[['Mandy', 82.5, 'A'], ['Bob', 95.0, 'A'], ['Alan', 86.0, 'C'], ['Rob', 86, 'E']] # 当第二个字段成绩相同的时候按照等级从低到高排序

字典中混合list排序

如果字典中的 key 或者值为列表,需要对列表中的某一个位置 的元素排序也是可以做到的。看例子:

针对字典 mydict 的 value 结构 [n,m] 中的 m 按照从小到大的顺序排列。

>>> mydict = { 
    'Li'   : ['M',7],
...            'Zhang': ['E',2],
...            'Wang' : ['P',3],
...            'Du'   : ['C',2],
...            'Ma'   : ['C',9],
...            'Zhe'  : ['H',7] }
>>>
>>> from operator import itemgetter
>>> sorted(mydict.iteritems(), key=lambda (k,v): operator.itemgetter(1)(v))
[('Zhang', ['E', 2]), ('Du', ['C', 2]), ('Wang', ['P', 3]), ('Li',['M', 7]), ('Zhe', ['H', 7]), ('Ma', ['C', 9])]

字典中混合list排序

列表中的每一个元素为字典形式,需要针对字典的多个key 值进行排序也不难实现。
看例子:

针对 list 中的字典元素按照 rating 和 name进行排序的实现方法。

''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! '''
>>> gameresult = [
    { 
    "name":"Bob", "wins":10, "losses":3, "rating":75.00 },
... { 
    "name":"David", "wins":3, "losses":5, "rating":57.00 },
... { 
    "name":"Carol", "wins":4, "losses":5, "rating":57.00 },
... { 
    "name":"Patty", "wins":9, "losses":3, "rating": 71.48 }]
>>> from operator import itemgetter
>>> sorted(gameresult , key=operator.itemgetter("rating","name"))
[
{ 
   'wins': 4, 'losses': 5, 'name': 'Carol', 'rating': 57.0}, 
{ 
   'wins': 3, 'losses': 5, 'name': 'David', 'rating': 57.0}, 
{ 
   'wins': 9, 'losses': 3, 'name': 'Patty','rating': 71.48}, 
{ 
   'wins': 10, 'losses': 3, 'name': 'Bob', 'rating': 75.0}]

PS python2 与python3区别

sorted(iterable, cmp=None, key=None,reverse=False)      ## Python 2.x

sorted(iterable, key=None,reverse=False)                ## Python 3.x

由此可看出,Python3.x取消了 cmp参数, 所以如果想给 sorted()函数传参的话,就剩下 key,和reverse了。

也就是说我们无法直接传入多个参数的函数进行排序

如果直接写的话,会发现

## 报错信息如下:
TypeError: must use keyword argument for key function

类型错误: 必须使用关键字参数。
那么我们该如何解决这个问题呢?

那就是使用functools中的cmp_to_key,即在开头加上

from functools import cmp_to_key

from functools import cmp_to_key
def desc(color1_list,color2_list):
    if len(color1_list) == 0:
         return -1
    else:
         if len(color2_list) == 0:
            return 1
         if color1_list[0] > color2_list[0]:
            return 1
         else:
            return -1
sameList = sorted(sameTypeList,key = cmp_to_key(desc))
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234722.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • JAVA获取服务器上文件路径,java 获取远程服务器目录的路径

    JAVA获取服务器上文件路径,java 获取远程服务器目录的路径java获取远程服务器目录的路径内容精选换一换已将所需升级的鲲鹏性能分析工具的软件包下载到本地。获取软件包后,需要校验软件包,确保与网站上的原始软件包一致,详细步骤请参见软件包校验。获取软件包后,需要校验软件包,确保与网站上的原始软件包一致,详细步骤请参见软件包校验。升级前请确认鲲鹏性能分析工具可以正常使用。升级前请确认安装空间至少保留原工具安装目录的大小加上新版本安装空间(1GB)为加强对系…

  • 小弟博客_博客来网址

    小弟博客_博客来网址原来位于Google上的博客在国内基本不能访问了,现在找了个新家,准备发布一些我这些年来编写的东西,主要集中在算法研究和程序设计上,语言主要是.NET(C#)和Delphi,当然,其它软件开发、算法相关的许多东西也会陆续加入,例如:JavaScript、XML、Web技术等等,另外也会有极少量的与IT行业不相关的东西。旧的不去,新的不来,旧博客关了也好,新博客总算是中文的…

  • 粒子群优化算法的实现方式_matlab粒子群优化算法

    粒子群优化算法的实现方式_matlab粒子群优化算法粒子群优化算法实现容易、精度高、收敛快,在解决实际问题中展示了其优越性。文章目录1算法基本概念2算法的MATLAB实现3粒子群算法的权重控制4混合粒子群算法参考文献1算法基本概念粒子群优化算法属于进化算法的一种,通过追随当前搜索到的最优值来寻找全局最优。粒子群算法也称粒子群优化算法(ParticleSwarmOptimization,PSO),PSO有几个关键概念:粒子、优化函数、适值(FitnessValue)、飞行方向、飞行距离。2算法的MATLAB实现3粒子群算法的权重控

    2022年10月11日
  • kmp算法 入门题

    kmp算法 入门题

  • redis 压缩表存储数据库数据(数据结构链表的特点)

    本文所引用的源码全部来自Redis2.8.2版本。Redis中ziplist数据结构与API相关文件是:ziplist.h,ziplist.c,t_zset.c。一、ziplist的构成是一个4字节无符号整数,用来存储整个ziplist占用的字节数;是一个4字节无符号整数,用来存储ziplist最后一个节点的相对于ziplist首地址偏移量;是一个2字节

  • 数据库锁概述[通俗易懂]

    数据库锁概述[通俗易懂]行锁和表锁主要是针对锁粒度划分的,一般分为行锁、表锁、库锁行锁:访问数据库的时候,锁定整个行数据,防止并发错误。表锁:访问数据库的时候,锁定整个表数据,防止并发错误。二者的区别:表锁:开销小,加锁快,不会出现死锁;锁定粒度大,发生锁冲突概率高,并发度最低。行锁:开销大,加锁慢,会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。乐观锁和悲观锁乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有更新这个数据,可以使用版

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号