• Python基础教程:序列排序


    前言

    大家早好、午好、晚好吖 ❤ ~欢迎光临本文章

    话不多说,直接开搞,如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码

    正文

    python中,一般在涉及到列表排序时,都用内置的sort()方法或者全局的sorted()方法,区别如下:

    1. sort()方法只能用于列表排序,不能用于字符串,字典等其他可迭代序列;
      sorted()方法可以用于所有的可迭代序列;

    2. sort()方法是在原列表基础上进行排序,返回None,会破坏原始列表结构;
      sorted()方法是返回一个排序后的新序列,对原始列表无影响;

    #sort()排序
    >>> a=[6,9,8,4,3,1,2]
    >>> b=a.sort()
    >>> print(b)
    None
    >>> print(a)
    [1, 2, 3, 4, 6, 8, 9]
    
    #sorted()排序
    >>> a=[6,9,8,4,3,1,2]
    >>> b=sorted(a)
    >>> print(b)
    [1, 2, 3, 4, 6, 8, 9]
    >>> print(a)
    [6, 9, 8, 4, 3, 1, 2]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    字典排序时,sorted()方法默认是按照字典的键(key)排序的,如下:

    >>> a={5:'A',1:'E',4:'B',2:'D',3:'C'}
    >>> b=sorted(a)
    >>> print(b)
    [1, 2, 3, 4, 5]
    
    • 1
    • 2
    • 3
    • 4

    如果需要按照字典的value排序,可以用下面的方法:

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    >>> a={5:'A',1:'E',4:'B',2:'D',3:'C'}
    >>> b=sorted(a.items(), key=lambda item:item[1])
    >>> print(b)
    [(5, 'A'), (4, 'B'), (3, 'C'), (2, 'D'), (1, 'E')]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    高级用法

    sort()方法和sorted()方法都可以指定参数来处理一些复杂场景的排序

    1. key参数:指定一个函数,可以是内置函数,也可以是自己定义的函数,此函数将在每个元素比较前被调用。

    2. reverse参数:此参数指定True or False,来进行降序或者升序,默认为False(升序)。

    如下:

    a = ["This", "A", "is", "bag"]
    b = sorted(a, key=str.lower)
    c = sorted(a, key=str.lower, reverse=True)
    print(b)
    print(c)
    
    ['A', 'bag', 'is', 'This']
    ['This', 'is', 'bag', 'A']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    更广泛的使用情况是用复杂对象的某些值来对复杂对象的序列排序,例如:

    一个列表保存着每个学生的姓名,档次和分数

    student_tuples = [
        ('john', 'A', 96),
        ('leky', 'D', 63),
        ('andy', 'A', 92),
        ('jane', 'B', 82),
        ('dave', 'B', 85),
        ('cany', 'A', 96)
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    场景1、按档次从高到低进行排序

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    student_tuples = [
        ('john', 'A', 96),
        ('leky', 'D', 63),
        ('andy', 'A', 92),
        ('jane', 'B', 82),
        ('dave', 'B', 85),
        ('cany', 'A', 96)
    ]
    print(sorted(student_tuples, key=lambda student: student[1]))
    
    [('john', 'A', 96), ('andy', 'A', 92), ('cany', 'A', 96), ('jane', 'B', 82), ('dave', 'B', 85), ('leky', 'D', 63)]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    场景2、按分数从高到低排序

    方法(1)、使用reverse参数

    student_tuples = [
        ('john', 'A', 96),
        ('leky', 'D', 63),
        ('andy', 'A', 92),
        ('jane', 'B', 82),
        ('dave', 'B', 85),
        ('cany', 'A', 96),
    ]
    print(sorted(student_tuples, key=lambda student: student[2], reverse=True))
    
    [('john', 'A', 96), ('cany', 'A', 96), ('andy', 'A', 92), ('dave', 'B', 85), ('jane', 'B', 82), ('leky', 'D', 63)]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    方法(2)、使用负号(-)

    student_tuples = [
        ('john', 'A', 96),
        ('leky', 'D', 63),
        ('andy', 'A', 92),
        ('jane', 'B', 82),
        ('dave', 'B', 85),
        ('cany', 'A', 96),
    ]
    print(sorted(student_tuples, key=lambda student: -student[2]))
    
    [('john', 'A', 96), ('cany', 'A', 96), ('andy', 'A', 92), ('dave', 'B', 85), ('jane', 'B', 82), ('leky', 'D', 63)]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    注意:负号(-)只能用于数字前面,不能用于字符串前面

    场景3、按档次从低到高进行排序,档次相同的按分数从低到高排序

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    student_tuples = [
        ('john', 'A', 96),
        ('leky', 'D', 63),
        ('andy', 'A', 92),
        ('jane', 'B', 82),
        ('dave', 'B', 85),
        ('cany', 'A', 96)
    ]
    print(sorted(student_tuples, key=lambda student: [student[1], -student[2]],reverse=True))
    
    [('leky', 'D', 63), ('jane', 'B', 82), ('dave', 'B', 85), ('andy', 'A', 92), ('john', 'A', 96), ('cany', 'A', 96)]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    场景4、按档次从低到高进行排序,档次相同的按分数从低到高排序,最后再按照姓名升序

    姓名是字符串,不能在字符串前面用“符号(-)”来排序,可以重写“富比较”方法

    class Reversinator(object):
        def __init__(self, obj):
            self.obj = obj
    
        def __lt__(self, other):
            return other.obj < self.obj
    
    
    student_tuples = [
        ('john', 'A', 96),
        ('leky', 'D', 63),
        ('andy', 'A', 92),
        ('jane', 'B', 82),
        ('dave', 'B', 85),
        ('cany', 'A', 96),
    ]
    
    print(sorted(student_tuples, key=lambda student: [student[1], -student[2], Reversinator(student[0])], reverse=True))
    
    [('leky', 'D', 63), ('jane', 'B', 82), ('dave', 'B', 85), ('andy', 'A', 92), ('cany', 'A', 96), ('john', 'A', 96)]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    尾语

    好了,今天的分享就差不多到这里了!

    对下一篇大家想看什么,可在评论区留言哦!看到我会更新哒(ง •_•)ง

    喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!

    最后,宣传一下呀~👇👇👇 更多源码、资料、素材、解答、交流 皆点击下方名片获取呀👇👇👇

  • 相关阅读:
    1、拓扑排序 2、逆拓扑 3、i到j之间长度为k的路径 4、i到j之间包含顶点x的路径是否存在 5、如果边是带权的,求解 i 到 j 之间长度最长的路径
    【AnolisOS 8.x】配置本地 repo 源
    CVE漏洞复现-CVE-2023-38831 WinRAR代码执行漏洞
    Python安装指南:安装Python、配置Python环境(附安装包)
    计算机视觉快速入门一 —— 图像基本操作(二)
    Rust插件连接失败
    分布式链路追踪技术
    Vue3最佳实践 第七章 TypeScript 中
    ImmunoChemistry艾美捷ELISA洗涤缓冲液说明书
    [答疑]泛化关系上的泛化集(Generalization Set)操作
  • 原文地址:https://blog.csdn.net/weixin_62853513/article/details/132811617