• 人肉分析sorted(lst, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.islower(), x.isupper(), x))过程


    闲来无事惹麻烦

    闲的慌于是打算看下python基础的一些函数,看到sorted的时候发现了比较怪异的排序需求,于是就有了这篇博文

    1. 需求
     大写字母在前,小写字母在后
     所有的字母在数字前面
     所有的奇数在偶数前面
    
    2. 必须知道的sorted知识点
    sorted函数如果返回的是一个元组, 那么排序规则是: 先对比所有元组的第一个元素, 再对比第二个...第n个
    reverse参数为false, 为升序排列, 例如:
    lst = [(0, 3), (0, 2), (1, 1)]  
    print(sorted(lst)) # reverse=Flase
    第一次:[(0, 3),(0, 2),(1, 1)]  # 和原来保持一致, 因为各个元组的第一个元素已经是升序了
    第二次:[(0, 2),(0,3),(1,1)]	 # 原来列表的第一个元素和第二个元素位置互换, 因为(0,2)的第二个元素小于(0,3)的第二个元素,所以在前面
    

    3. 被排序字符串str_sorted = 'H73Wo'

    其实呢sorted(list1, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.islower(), x)) 和
    sorted(lst, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.islower(), x.isupper(), x))过程效果是一毛一样的
    
    先说一下这个表达式是怎么得出的:
    1. 首先我们被排序的字符串中的元素分为两类: 1. 字母 2. 数字
    2. 既然字母需要在前, 所以我们lambda函数结果中元组第一个元素一定要把字母和数字分开(# 这里直接用x.digist(), 如果为数字那么就一定在字母后面, 也就达到了我们的第二个目的)
    3. 大写字母要在小写字母前, 那么就是大写需要为False即x.lower()为假即可
    4. 最后是奇数在偶数前: 即x.digist() and int(x) % 2 == 0 为真即可
    5. 最最后如果还要求按照升序排列 则最后加一个x 即可
    
    
    <body> <div> <table> <thead> <th>编号</th> <th>元素</th> <th>被sorted函数作用后的元素结果</th> </thead> <tbody> <tr> <td>1</td> <td>Z</td> <td>(False, False, False, Z)</td> </tr> <tr> <td>2</td> <td>7</td> <td>(True, False, False, 7)</td> </tr> <tr> <td>3</td> <td>2</td> <td>(True, True, False, 2)</td> </tr> <tr> <td>4</td> <td>W</td> <td>(False, False, False, W)</td> </tr> <tr> <td>5</td> <td>o</td> <td>(False, False, True, o)</td> </tr> <tr> <td>6</td> <td>3</td> <td>(True, False, False, 3)</td> </tr> </tbody> </table> </div> </body> 上面说了两种表达式的结果是一毛一样(可以自测一下)的,所以我就选择结果表达式字符少的来举例吧(偷懒了哈哈) #### 过程分析 ``` "|" 符号左边是字母,右边是数字, 这里具体的就用需要代替了,最后出结果的时候再换上对应的字符

    第一次排序. 145 236 即 ZWo 723
    第二次排序. 145 263 即 ZWo 732
    第三次排序. 145 263 即 ZWo 732
    第四次排序. 415 623 即 WZo 372
    所以结果就出来啦['W', 'Z', 'o', '3', '7', '2']

  • 相关阅读:
    归并排序(Merge Sort)
    AtCoder AGC035D Add and Remove (状压DP)
    AtCoder AGC034D Manhattan Max Matching (费用流)
    AtCoder AGC033F Adding Edges (图论)
    AtCoder AGC031F Walk on Graph (图论、数论)
    AtCoder AGC031E Snuke the Phantom Thief (费用流)
    AtCoder AGC029F Construction of a Tree (二分图匹配)
    AtCoder AGC029E Wandering TKHS
    AtCoder AGC039F Min Product Sum (容斥原理、组合计数、DP)
    AtCoder AGC035E Develop (DP、图论、计数)
  • 原文地址:https://www.cnblogs.com/zunwen/p/9953025.html
Copyright © 2020-2023  润新知