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)]
python sorted() 多重排序的更多相关文章
- 关于Python的多重排序
Python预置的list.sort().sorted()方法可实现各种数组的排序,但支持的只限于一个key,如果要多重排序,目前所知的方法只有自定义了. Help on built-in funct ...
- Python复杂多重排序
1. cmp函数是python自带的函数,用于比较两个参数哪个大哪个小 print cmp(2, 3) # -1 如果第一个参数比第二个小,就返回-1,两个元素相等,返回0,否则返回1 2.所以就可以 ...
- python sorted排序
python sorted排序 Python不仅提供了list.sort()方法来实现列表的排序,而且提供了内建sorted()函数来实现对复杂列表的排序以及按照字典的key和value进行排序. s ...
- python sorted排序用法详解
sorted排序 python sorted 排序 1. operator函数在介绍sorted函数之前需要了解一下operator函数. operator函数是python的内置函数,提供了一系列常 ...
- 【Python】 sort、sorted高级排序技巧
文章转载自:脚本之家 这篇文章主要介绍了python sort.sorted高级排序技巧,本文讲解了基础排序.升序和降序.排序的稳定性和复杂排序.cmp函数排序法等内容,需要的朋友可以参考下 Pyth ...
- python sort、sorted高级排序技巧(转)
add by zhj: 没找到原文.可以按多个维度进行排序,而且可以指定他们的排序方向,如果维度都是数字,排序比较容易,用+/-号就可以 指定排序方向.否则,就调用多次sorted进行排序了,而且要按 ...
- 深入Python(1): 字典排序 关于sort()、reversed()、sorted()
http://www.cnblogs.com/BeginMan/p/3193081.html 一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠 ...
- 【转载】 python sort、sorted高级排序技巧
这篇文章主要介绍了python sort.sorted高级排序技巧,本文讲解了基础排序.升序和降序.排序的稳定性和复杂排序.cmp函数排序法等内容,需要的朋友可以参考下 Python list内置so ...
- Python:如何排序(sort)
一.前言 对Python的列表(list)有两个用于排序的方法: 一个是内建方法list.sort(),可以直接改变列表的内容: >>> list1 = [9,8,7,6,5] &g ...
- python sorted和sort
我们需要对List进行排序,Python提供了两个方法 对给定的List L进行排序, 方法1.用List的成员函数sort进行排序 方法2.用built-in函数sorted进行排序(从2.4开始) ...
随机推荐
- Mac下MySQL下载及安装
1在浏览器当中输入地址: https://downloads.mysql.com/archives/community/ 1. 1.1,选择mysql版本,它会自动对应某个版本macOS,1.2 ...
- JavaSE——复杂对象数组练习
定义一个长度为3的数组,数组存储1~3名学生对象作为初始数据,学生对象的学号,姓名各不相同. 学生的属性:学号,姓名,年龄. 要求1:再次添加一个学生对象,并在添加的时候进行学号的唯一性判断. 要求2 ...
- centos 7 删除乱码文件
1.通过ls -li 获取要删除乱码文件名文件的inode号,比如得到的是 33575029 2.通过以下命令删除文件:find ./ -inum 33575029 -exec rm -rf {} \ ...
- mysql拼接多条字段
转 未合并情况 SELECTa.id,b.name AS "role"FROM sys_user aINNER JOIN sys_user_role c ON a.id=c.use ...
- Docker Mysql修改时区
背景 时区是使用了世界标准时间(UTC).因为在中国使用,所以需要把时区改成东八区的 或者启动容器时设置 -e TZ=Asia/Shanghai 永久修改 进入容器 docker exec -it m ...
- Servlet中使用request转发页面引发的500空指针异常
多余的不说如果你出现了我下面这张图的异常错误,可以继续看下去: 上面的错误是因为我们使用的转发地址错误引起的,这样他转发的地址不存在,则会出现空指针异常. register.jsp在我的Tomcat的 ...
- Stream流常用API
文档 https://www.runoob.com/java/java8-streams.html JDK8 Stream API: https://docs.oracle.com/javase/8/ ...
- 最后的 SPRING
其核心JAR包spring-web-5.2.0.RELEASE.jar和spring-core-5.2.0.RELEASE.jar的大小均为1.4MB左右 基于工厂模式实现对象的创建 添加了国际化.事 ...
- Spyder无法使用搜狗输入中文的解决办法
Ubuntu 18.04 LTS系统下,spyder4编辑器无法使用搜狗输入中文.系统输入法为fcitx+搜狗拼音,chrome浏览器无此问题.网上答案: Spyder (以及其他PyQt程序) 无法 ...
- vue+vant-ui移动端适配 宽高
一:在vue中安装vant 1.npm i vant -S 2.npm i babel-plugin-import -D // 在.babelrc 中添加配置 { "plugins" ...