You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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,大写字母返回True
    False < 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:23:17