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参数的作用原理相关推荐

  1. python函数中可变参数的传递方式是_Python中函数的参数传递与可变长参数

    1.Python中也有像C++一样的默认缺省函数 1 def foo(text,num=0):2 printtext,num3 4 foo("asd") #asd 0 5 foo( ...

  2. 在setInterval函数中传递参数

    本文翻译自:Pass parameters in setInterval function Please advise how to pass parameters into a function c ...

  3. [SpringBoot2]ajax函数中data参数的数据设置方式

    ajax函数中data参数的数据设置方式:

  4. listen函数的第二个参数_signal(SIGPIPE,?SIG_IGN)listen函数中backlog参数分析

    signal(SIGPIPE, SIG_IGN); TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 但本端 ...

  5. libvlc_media_add_option 函数中的参数设置

    libvlc_media_add_option   函数中的参数设置 Usage: vlc [options] [stream] ... You can specify multiple stream ...

  6. Pytorch中tensor维度和torch.max()函数中dim参数的理解

    Pytorch中tensor维度和torch.max()函数中dim参数的理解 维度 参考了 https://blog.csdn.net/qq_41375609/article/details/106 ...

  7. 以下是一个使用 VBA 的例子,演示了 ByVal 和 ByRef 的区别,以及如何在函数中传递参数和返回值。

    以下是一个使用 VBA 的例子,演示了 ByVal 和 ByRef 的区别,以及如何在函数中传递参数和返回值: Sub Example()Dim x As Integer, y As Integerx ...

  8. 函数中out参数的应用

    函数中out参数的应用 1.out参数使用情况说明 如果你在一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组: 但是,如果返回多个不同类型的值的时候,返回数组就不行了,那么这个时候,我们可 ...

  9. Python花式编程案例集锦(9):sorted()函数中消失的cmp参数

    明天开启全国巡讲Python模式,连续8场20天讲课,外加路上来回大约16天,这个假期有的忙了.所以接下来的一段时间里不一定能像以前更新的那么频繁,我尽量. 在很久很久很久以前,公众号曾经推送过这样一 ...

最新文章

  1. python编程词汇-基本 Python 词汇
  2. linux内核网络协议栈--packet_type(十二)
  3. php中的大括号用法
  4. sqlite java需要按照,SQLite:java/jdbsqlite和python/sqlite3的区别
  5. 机械秒表的使用方法_瓦楞纸箱防水性能检测方法
  6. [蓝桥杯]ALGO-188.算法训练_P0504
  7. 设计模式笔记[四种模式+四种原则]
  8. Pandas知识点-排序操作
  9. html地址--待更新
  10. SQL SERVER全局变量
  11. Silverlight 用户代码未处理 TypeLoadException
  12. vue打包后路径404问题解决方法
  13. python自学教程-Python学习教程(一)自学资源分享
  14. redis基础学习(一)— 配置项
  15. [转载]敏捷开发,你真的做对了吗?
  16. 南京市建筑物矢量数据(Shp格式+带高度)
  17. 01_博图默认变量和DB块变量导入昆仑通态触摸屏
  18. 随机森林回归预测r语言_R包randomForest的随机森林回归模型以及对重要变量的选择...
  19. EBS API及接口
  20. kettle使用命令行来运行ktr和kjb

热门文章

  1. basename函数使用
  2. 进程通信学习笔记(System V消息队列)
  3. stl的set,multiset, map, multimap, deque, list, stack, queue, priority_queue
  4. 前端技术学习路线及技术汇总
  5. E: Could not get lock /var/lib/dpkg/lock解决
  6. 2014 Centos 6 minimal 安装mysql5
  7. NET MVC3 中的枚举多语言实现,DescriptionPairAttribute
  8. XAMPP维基百科,自由的百科全书
  9. linux无任务内存被占满,centos服务器CPU被GC task占满,程序无内存溢出
  10. git fetch比较差异