关于sorted()函数中lambda排序键实现特定排序的逻辑疑问
字符串自定义排序逻辑解析
需求说明
需要按照以下规则对字符串进行排序:
- 小写字母排在大写字母之前
- 大写字母排在数字之前
- 奇数数字排在偶数数字之前
示例:输入"Sample6789",输出为"aelmpS7968"
实现代码
s = 'Sample6789' print("".join(sorted(s, key=lambda x: (x.isdigit(), x.isdigit() and int(x)%2==0, x.isupper(), x))))
排序逻辑详解
Python的sorted()函数会根据key参数返回的元组进行字典序排序——元组从左到右依次比较,前一位元素相同时才会比较后一位。下面逐个拆解lambda返回的元组(x.isdigit(), x.isdigit() and int(x)%2==0, x.isupper(), x)的作用:
1. 第一个元素:x.isdigit()
布尔值排序时遵循False < True,因此:
- 非数字字符(小写、大写字母)返回
False,排在所有数字前面 - 数字字符返回
True,排在后面
这直接满足了「大小写字母在数字前」的规则。
2. 第二个元素:x.isdigit() and int(x)%2==0
这个条件仅对数字生效(非数字的第一个元素是False,已经和数字完成区分):
- 奇数数字:
x.isdigit()为True,但int(x)%2==0为False,整体返回False - 偶数数字:整体返回
True
因为False < True,所以奇数会排在偶数前面,满足规则三。
3. 第三个元素:x.isupper()
针对非数字的字符(第一个元素是False):
- 小写字母返回
False,大写字母返回TrueFalse < True,所以小写字母会排在大写字母前面,满足规则一。
4. 第四个元素:x
当前面所有条件都相同时,按照字符本身的ASCII码排序:
- 小写字母按a-z顺序排列(比如
Sample中的a,e,l,m,p) - 大写字母按A-Z顺序排列(示例中仅
S) - 奇数数字按本身大小排序(7,9),偶数数字同理(6,8)
字符元组示例
拿输入里的几个字符举例:
- 小写字母
a:(False, False, False, 'a') - 大写字母
S:(False, False, True, 'S') - 奇数
7:(True, False, False, '7') - 偶数
6:(True, True, False, '6')
所有字符的元组按字典序排序后,再拼接成字符串,就得到了预期的aelmpS7968。
内容的提问来源于stack exchange,提问作者Jagernout1985
相关产品推荐
相关产品推荐

