关于Python sorted()排序特殊语法的咨询及实现疑问
HackerRank字符频率排序问题解析
问题说明
我在做一道HackerRank题目,要求从字符串里找出出现次数排名前三的字符,排序规则是:
- 出现次数多的排在前面
- 若次数相同,按字母顺序升序排列
给定输入字符串'aabbbccde',预期输出为:
b 3 a 2 c 2
两种排序代码对比
正确代码(通过所有测试用例)
这段代码能通过包括隐藏用例在内的所有测试,但我一开始没弄明白它的逻辑:
logo = sorted(all_freq.items(), key=lambda x: (-x[1], x[0]))
我的代码(仅通过部分测试用例)
我自己写的代码只通过了部分测试(包括示例),但无法覆盖所有场景:
logo = sorted(all_freq.items(), key=lambda x:x[1], reverse=True)
语法逻辑拆解
正确代码的原理
sorted()函数默认是升序排序,这里的lambda返回了一个元组,利用元组的排序特性(依次比较每个元素)实现了题目要求的双重排序规则:
-x[1]:x[1]是字符的出现次数,对次数取负数后,原本次数多的数值会变成更小的负数。因为sorted()默认升序,更小的负数会排在前面,相当于实现了次数降序的效果。x[0]:当两个字符的次数相同时(也就是-x[1]的值相等),会比较元组的第二个元素——字符本身。字符串默认按字母序升序比较,这样就满足了次数相同时字母升序排列的要求。
我的代码的问题
我的写法只指定了按次数降序(reverse=True),但当次数相同时,sorted()会按照all_freq.items()的原始顺序(字典的插入顺序)来排序,而不是按字母顺序,这就导致部分测试用例不通过。
内容的提问来源于stack exchange,提问作者CMurph
相关产品推荐
相关产品推荐

