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))
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2025年5月27日 下午8:22
下一篇 2025年5月27日 下午9:01


相关推荐

  • 欢迎来到WebGPU的世界

    欢迎来到WebGPU的世界欢迎来到 WebGPU 的世界 WebGPU 是一门神奇的技术 在浏览器支持率 0 标准还没有定稿的情况下 就已经被 Three js 和 Babylon js 等主流 3D 和游戏框架支持了 而且被 Tensorflow js 用来加速手机端的深度学习 比起 WebGL 能带来 20 30 倍的显著提升 在主流框架中 WebGPU 的例子在 Three js 中使用 WebGPU 使用 Three js 的封装 我们可以直接生成 WebGPU 的调用 我们照猫画虎引入 WebGPU 相关的库 import asTHREEfrom

    2026年3月20日
    2
  • Eclipse中安装ADT插件

    Eclipse中安装ADT插件一 ADT 下载在搭建 Android 开发环境的时候 我们需要为 Eclipse 安装 ADT AndroidDevel 插件 这个插件可以为用户提供一个强大的 Android 集成开发环境 通过给 Eclipse 安装 ADT 插件 用户才能够完成快速新建 Android 项目 创建界面 调试程序 导出 apk 等一系列的开发任务 一般来说我们可以在线安装 1 nbsp nbsp 点击菜单中的 He

    2026年3月18日
    1
  • 诺基亚6300手机游戏下载_重玩JAVA手机游戏

    诺基亚6300手机游戏下载_重玩JAVA手机游戏随着安卓苹果手机的普及、手机的性能不断提高,手机游戏也从黑白俄罗斯方块进化为了各种华丽大作,有的甚至已经超越了多年前的电脑游戏。然而令人惋惜的是,大多数游戏只是画面进步了,玩法却在退步,这一点,从塞班、JAVA、MTK山寨机时代走过来的玩家肯定深有体会。想想看,在那个手机网络不发达,一个月10M流量用不完的年代,手机游戏厂商自然是以开发单机游戏为重心,即便是手机网游,比如口袋精灵,天劫OL,契约等…

    2022年7月8日
    26
  • HBase的shell命令行界面按退格键(Backspace)无法删除问题

    HBase的shell命令行界面按退格键(Backspace)无法删除问题HBase的shell命令行界面按退格键(Backspace)无法删除问题

    2022年4月23日
    50
  • 正则表达式用法简介与速查

    正则表达式用法简介与速查

    2021年7月5日
    202
  • 某Java大佬在地表最强Java企业(阿里)面试总结

    面试题真的是博大精深,也通过这个面试题学到了很多东西,很多笔者也不是很懂,如有描述错误的地方还望大佬赐教HashMap和Hashtable的区别Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。Hashtable中的方法是Synchronize的,而HashMap中的方法在缺省情况下是非Synchronize的。HashMap把Hashtable的contains方法去掉了,改成containsValue和contains.

    2022年4月7日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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