zoukankan      html  css  js  c++  java
  • python sorted() 多重排序

    前言:
    最开始是因为看到一道题目, 用一行代码解决[1, 2, 3, 11, 2, 5, 3, 2, 5, 3] 输出[11, 1, 2, 3, 5]
    本来想法很简单,先去重后排序
    但是遇到一个难点
    用sorted排序的时候,无法使得11排在1后面

    解决思路

    第一版本的解决办法,我采用的是用两次排序(先按大小值排序,再按宽度逆向排序),但是这样显得很繁琐,这一行代码很长

    再次查找资料,发现sorted的更多用法
    最终采用了下面这个版本的解决办法

    l = [1, 2, 3, 11, 2, 5, 3, 2, 5, 3,12,13]
    sorted(set(l),key=lambda i:[-len(str(i)),i])  # [11, 12, 13, 1, 2, 3, 5]
    

    相关知识汇总:

    sorted(*args, **kwargs)
    官方注释是
    '''
    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.
    '''
    翻译:返回一个新列表,其中包含按升序排列的iterable中的所有项。可以提供自定义键函数来定制排序顺序,还可以设置反转标志来按降序请求结果。
    注释很简单,本来想查看源码确定一下这个函数的执行过程,但是水平有限,这条路暂时搁浅了,以下只是说说我对这个函数的理解,日后有更深的理解再更新。

    sorted可以通过key值,传入一个函数,把原序列的每一个元素,带入函数中,由函数结果进行排序。
    key=lambda i:[-len(str(i)),i]
    创建一个匿名函数,输入变量为i,原序列set(l)中每一个元素带入i值
    因为set()是集合,是无序的,就假设第一个值为“1”,lambda i:[-len(str(i)),i]的结果为[-1,1]
    第二个值为“11”,lambda i:[-len(str(i)),i]的结果为[-2,11]
    第三个值为“2”,lambda i:[-len(str(i)),i]的结果为[-1,2]
    ……
    之后对[-1,1]、[-2,11]、[-1,2]……进行排序,因为没有设置反转标志,所以默认从小到大排序。则-2排在-1前面,达到宽度越大排序越前的要求。[-2,11]在[-1,2]和[-1,1]前面,再比对后一位,如1<2,则[-1,1]会在[-1,2]前面。因此最后的排序结果为[-2,11]->[-1,1]->[-1,2],也就是11->1->2,其他数值以此类推进行排序

    之后看到大佬的解决方法,更简洁,就此记录:
    [list(set(L))[i] for i in range(-1,4)]

  • 相关阅读:
    线程学习笔记(一)
    进程间通信
    管道通信操作
    在程序中执行shell命令
    进程控制(一)
    Makefile文件学习总结
    进程学习笔记
    C#不安全代码和指针
    Unity3D ShaderLab 修改渲染队列进行深度排序
    Unity3D ShaderLab 透明裁剪着色器
  • 原文地址:https://www.cnblogs.com/congyinew/p/12083379.html
Copyright © 2011-2022 走看看