Python两种自定义排序实现的技术差异及结果不同原因
两种排序实现的技术差异解析
给定排序规则:
- 优先按元音数量降序排列
- 元音数量相同时,按字符串长度升序排列
- 前两个条件都相同时,按逆字母序排列
示例输入:['pear', 'peach', 'apple', 'banana', 'avocado']
预期输出:['avocado', 'banana', 'pear', 'peach', 'apple']
错误实现(结果不符合预期)
def key_vowels(x): vowels = set("aeiouAEIOU") return -sum(1 for char in x if char in vowels), -len(x), x[::-1] l = ['pear', 'peach', 'apple', 'banana', 'avocado'] sorted(l, key=key_vowels)
问题:输出最后两个元素顺序颠倒,不符合预期
正确实现(结果符合预期)
def key_vowels(x): vowels = set("aeiouAEIOU") return sum(1 for char in x if char in vowels), -len(x), x l = ['pear', 'peach', 'apple', 'banana', 'avocado'] sorted(l, key=key_vowels, reverse=True)
核心差异解析
Python的sorted()默认是升序排序,我们逐个拆解两种实现的逻辑:
1. 错误实现的逻辑问题
错误实现返回(-元音数, -长度, 字符串反转),依赖默认升序排序:
-元音数:升序等价于原元音数降序,这部分没问题-长度:升序等价于原长度升序,这部分也没问题x[::-1]:按反转后的字符串升序排序,和要求的逆字母序完全相反。比如peach反转是hcaep,apple反转是elppa,升序时elppa<hcaep,导致apple排在peach前面,不符合预期。
2. 正确实现的逻辑
正确实现返回(元音数, -长度, 字符串),同时开启reverse=True(全局降序):
- 全局降序后,
元音数直接按降序排列,满足第一个规则 -长度降序等价于原长度升序(负数降序就是正数升序),满足第二个规则- 原字符串降序排序,正好是要求的逆字母序(比如
peach>apple,降序时peach排在apple前面),完美匹配第三个规则
关键细节对比
| 规则项 | 错误实现逻辑 | 正确实现逻辑 |
|---|---|---|
| 元音数量降序 | 通过-元音数默认升序实现,正确 | 通过元音数+reverse=True实现,正确 |
| 字符串长度升序 | 通过-长度默认升序实现,正确 | 通过-长度+reverse=True实现,正确 |
| 逆字母序 | 通过x[::-1]默认升序,逻辑错误 | 通过原字符串+reverse=True降序,正确 |
内容的提问来源于stack exchange,提问作者sen_596
相关产品推荐
相关产品推荐

