• python sorted函数详解2023.9.11


    1. 输入和输出

    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.
        
        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.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    sorted函数是一个python内置函数,就Python3.9.16来说,函数输入:(iterable, /, *, key=None, reverse=False)

    • iterable :任何可迭代的对象(字符串、列表、元组、字典等)
    • /: / 不代表任何参数,实际调用时该位置不用传值,它仅指示前面的都是位置参数,无需且不能进行关键字参数。
    • *:*出现在函数参数中第一种含义可以表示为可变参数,一般写作*args;对于单独出现在参数中的*参数,则表示,*后面的参数必须为关键字参数的形式.
    • key:A custom key function can be supplied to customize the sort order。接收一个函数来实现自定义的排序
    • reverse:the reverse flag can be set to request the result in descending order. reverse=False表示不用反转,正常数数(升序1234…),reverse=True表示需要反转,倒数(降序10987…)。

    PS: 在python3.8之后函数参数中允许出现/和*号。

    sorted函数输出:和输入类型相同的新的可迭代对象。

    2. key传入函数

    分析示例1:

    # 创建包含姓名和成绩的列表
    pairs = [("Alice", 85), ("Bob", 92), ("Charlie", 77), ("David", 92), ("Eve", 85)]
    
    # 使用sorted函数进行排序,首先按成绩排序,然后按姓名字母顺序排序
    sorted_pairs = sorted(pairs, key=lambda x: (-x[1], x[0]))
    
    # 打印排序后的结果
    for name, score in sorted_pairs:
        print(f"{name}: {score}")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

      先回顾lambda python语法lambda [arg1 [,arg2,.....argn]]:expression:匿名函数声明lambda,冒号前是输入参数,冒号后是表达式。PS: 语法中方括号只是用来表示参数列表的可选性,表明它们不是必需的部分。

    # lambda 输入参数:表达式,实现将输入参数带入表达式并返回表达式的值这一函数功能
    lambda x, y: x*y			# 函数输入是x和y,输出是它们的积x*y
    lambda:None					# 函数没有输入参数,输出是None
    lambda *args: sum(args)		# 输入是任意个数参数,输出是它们的和(隐性要求输入参数必须能进行算术运算)
    lambda **kwargs: 1			# 输入是任意键值对参数,输出是1
    
    • 1
    • 2
    • 3
    • 4
    • 5

      在深入了解一下sorted机理,key所表示函数只能返回可比较值,sorted会默认按照key所表示函数的返回值进行升序排列。但是如果返回值是一个元组时元组的第一个元素是用于排序的标准,第二个元素是用于次要排序的标准。 具体来说,就是按照元组的第一个元素进行升序排序,然后如果第一个元素相同时,按照元组的第二个元素进行升序排序。

    来回忆一下Python的变量,可比较值会加粗:

    整数(int):用于表示整数值,比如 42 或 -10。
    浮点数(float):用于表示带有小数部分的数值,比如 3.14 或 -0.25。
    字符串(str):用于表示文本数据,比如 ‘Hello, World!’ 或 “Python”。逐字符比较

    可迭代变量都是先比较第一个元素,挨个继续的,先终止迭代的认为是小的。

    布尔值(bool):用于表示逻辑值,只有两个可能的值,True 和 False。False 小于 True。
    列表(list):用于表示有序的可变序列,可以包含不同类型的元素。
    元组(tuple):用于表示有序的不可变序列,也可以包含不同类型的元素。
    集合(set):用于表示无序的、唯一的元素集合。
    字典(dict):用于表示键值对的集合,每个键对应一个值。

    尽管默认情况下迭代一个字典将返回字典的键。但一般认为字典无法直接迭代键值对,需要用使用字典的 .keys()、.values() 或 .items() 方法来迭代键、值或键值对。

    NoneType(None):用于表示缺少值或空对象。
    自定义对象(自定义类):可以创建的类和对象,这些对象具有自定义的属性和方法。

    sorted函数在构建时考虑了排序稳定性,即当多个记录具有相同的键值时,将保留其原始顺序。

    data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
    sorted(data, key=itemgetter(0))  # 按照key进行排序,blue>red,因为ASCLL表中b>r
    >>[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]
    
    • 1
    • 2
    • 3

    这说明如果第一个元素排序完,相同的值顺序不会变,这是相同的值可以通过key返回为元组时的第二个元素进行次要排序控制的基础。

  • 相关阅读:
    Yolov8引入 清华 ICCV 2023 最新开源移动端网络架构 RepViT | RepViTBlock即插即用,助力检测
    量化投资00
    【Terminal】Mac给Terminal添加快捷键(Ctrl-Alt-T) & 通过几行js节省平常重复性的工作
    Linux 远程数据同步工具详解
    VUE3页面截取部署后的二级目录地址
    【力扣刷题】神奇字符串
    使用实例解释UML类图
    基于JavaWeb+MySQL的简历信息管理系统
    sklearn 笔记 TSNE
    云服务多语言 SDK
  • 原文地址:https://blog.csdn.net/a_beatiful_knife/article/details/132816005