【转载】Python3 sorted函数中key参数的作用原理
https://segmentfault.com/q/1010000005111826
dokelung 4.8k 的回答
讓我們從一個簡單的例子開始:
items = [(1, 2), (2, 1)]
print(sorted(items))
結果:
[(1, 2), (2, 1)]
items 是一個 list of tuple,如果針對 tuple 排序,Python 的 Builtin function sorted(或是sort) 會從 tuple 的最後一個元素開始進行排序,也就是說一組二元素的 tuple 進行排序可以想像成兩次基本的排序:
原本是:
[(2, 1), (1, 2)]
第一次排序以第2個元素為 key,所以排序的結果為:
[(2, 1), (1, 2)]
第二次排序以第1個元素為 key,所以排序的結果為:
[(1, 2), (2, 1)] # 最終結果
結論(1):
tuple 的排序由最後的元素往前依次進行排序
也就是說 tuple 的排序權重是由第一個元素開始依次向後遞減
接著我們來觀察一下 Boolean value 的排序:
print(sorted([True, False])
結果:
[False, True] # False在前,True在後
結論2:
Boolean 的排序會將 False 排在前,True排在後
那我們來看看你給出的例子,我們撰寫一個簡單的 function 來觀察結果:
def show(s):
for x in s:
print((x.isdigit(), x.isdigit() and int(x)%2==0, x.isupper(), x.islower(), x))
function show 會列印出當下的字串 s 用來排序時每個字元所產生的 tuple key.
接著我們套用剛剛的結論1,我們先不使用 tuple 來作為 key,反而利用等價的 由最後一個元素往前依次為 key 排序,並且逐步觀察 s 和 tuple key 的變化:
print(‘key=x’)
s = sorted(s ,key=lambda x: x)
show(s)
print(‘key=islower()’)
s = sorted(s ,key=lambda x: x.islower())
show(s)
print(‘key=isupper()’)
s = sorted(s ,key=lambda x: x.isupper())
show(s)
print('key=isdigit() and int(x)%20’)
s = sorted(s ,key=lambda x: x.isdigit() and int(x)%20)
show(s)
我們將會發現一如預期地,依照結論(1),這樣的做法的確等價於一口氣以 tuple 為 key 來排序.
同時觀察,結論(2),對於 isdigit(), isupper(), islower()等所產生的 Boolean key 來說,排序的結果也如預期.
print(‘key=isdigit()’)
s = sorted(s ,key=lambda x: x.isdigit())
show(s)
不過我想這還不是我們最後的結論,因為這是一個碰巧的結果(說碰巧也許太超過了,應該說是不那麼直覺的結果),讓我們根據 結論(1) 對最初的例子進行分析:
sorted(s, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x))
這個排序我們可以翻譯成:
先對字元x本身做排序,接著是對 字元是否為小寫,字元是否為大寫,字元是否為偶數,字元是否為數字分別作排序.
也可以翻譯成:
我們以 字元是否為數字為最高排序權重,接著以字元是否為偶數,字元是否為大寫,字元是否為小寫,字元x本身為權重來做排序.
這似乎與一開始的目標(#排序:小写-大写-奇数-偶数)不同,起碼跟目標沒有直覺上的對應.
建議可以改成:
print("".join(sorted(s1, key=lambda x: (not x.islower(), not x.isupper(), not(x.isdigit() and int(x)%2==1), x))))
這樣就可以解讀為:
我們以 字元是否為小寫為最高權重,接著以字元是否為大寫,字元是否為奇數,字元x本身為權重來做排序
有趣的是:我們想要讓判斷式為 True 的字元在排序完成後在比較前面的位置,所以根據結論(2)加了一個 not來讓符合的字元可以在前面.
【转载】Python3 sorted函数中key参数的作用原理相关推荐
- python函数中可变参数的传递方式是_Python中函数的参数传递与可变长参数
1.Python中也有像C++一样的默认缺省函数 1 def foo(text,num=0):2 printtext,num3 4 foo("asd") #asd 0 5 foo( ...
- 在setInterval函数中传递参数
本文翻译自:Pass parameters in setInterval function Please advise how to pass parameters into a function c ...
- [SpringBoot2]ajax函数中data参数的数据设置方式
ajax函数中data参数的数据设置方式:
- listen函数的第二个参数_signal(SIGPIPE,?SIG_IGN)listen函数中backlog参数分析
signal(SIGPIPE, SIG_IGN); TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 但本端 ...
- libvlc_media_add_option 函数中的参数设置
libvlc_media_add_option 函数中的参数设置 Usage: vlc [options] [stream] ... You can specify multiple stream ...
- Pytorch中tensor维度和torch.max()函数中dim参数的理解
Pytorch中tensor维度和torch.max()函数中dim参数的理解 维度 参考了 https://blog.csdn.net/qq_41375609/article/details/106 ...
- 以下是一个使用 VBA 的例子,演示了 ByVal 和 ByRef 的区别,以及如何在函数中传递参数和返回值。
以下是一个使用 VBA 的例子,演示了 ByVal 和 ByRef 的区别,以及如何在函数中传递参数和返回值: Sub Example()Dim x As Integer, y As Integerx ...
- 函数中out参数的应用
函数中out参数的应用 1.out参数使用情况说明 如果你在一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组: 但是,如果返回多个不同类型的值的时候,返回数组就不行了,那么这个时候,我们可 ...
- Python花式编程案例集锦(9):sorted()函数中消失的cmp参数
明天开启全国巡讲Python模式,连续8场20天讲课,外加路上来回大约16天,这个假期有的忙了.所以接下来的一段时间里不一定能像以前更新的那么频繁,我尽量. 在很久很久很久以前,公众号曾经推送过这样一 ...
最新文章
- python编程词汇-基本 Python 词汇
- linux内核网络协议栈--packet_type(十二)
- php中的大括号用法
- sqlite java需要按照,SQLite:java/jdbsqlite和python/sqlite3的区别
- 机械秒表的使用方法_瓦楞纸箱防水性能检测方法
- [蓝桥杯]ALGO-188.算法训练_P0504
- 设计模式笔记[四种模式+四种原则]
- Pandas知识点-排序操作
- html地址--待更新
- SQL SERVER全局变量
- Silverlight 用户代码未处理 TypeLoadException
- vue打包后路径404问题解决方法
- python自学教程-Python学习教程(一)自学资源分享
- redis基础学习(一)— 配置项
- [转载]敏捷开发,你真的做对了吗?
- 南京市建筑物矢量数据(Shp格式+带高度)
- 01_博图默认变量和DB块变量导入昆仑通态触摸屏
- 随机森林回归预测r语言_R包randomForest的随机森林回归模型以及对重要变量的选择...
- EBS API及接口
- kettle使用命令行来运行ktr和kjb
热门文章
- basename函数使用
- 进程通信学习笔记(System V消息队列)
- stl的set,multiset, map, multimap, deque, list, stack, queue, priority_queue
- 前端技术学习路线及技术汇总
- E: Could not get lock /var/lib/dpkg/lock解决
- 2014 Centos 6 minimal 安装mysql5
- NET MVC3 中的枚举多语言实现,DescriptionPairAttribute
- XAMPP维基百科,自由的百科全书
- linux无任务内存被占满,centos服务器CPU被GC task占满,程序无内存溢出
- git fetch比较差异