JavaScript .sort()转Python sorted():多条件排序的回调与key转换
Python3 实现多条件排序(等价于你的JS排序逻辑)
问题场景
给定单词数组和记录单词出现次数的哈希表,排序规则如下:
- 单词按出现频率降序排列(高频在前)
- 频率相同时按字母顺序升序排列
你已经用JavaScript实现了逻辑:
let frequentWords = Object.keys(hash).sort((a, b) => { if (hash[b] === hash[a]) { return a.localeCompare(b); } else { return hash[b] - hash[a]; } });
下面解释如何用Python3的sorted函数结合key参数实现等价逻辑,以及多条件排序的扩展写法。
等价Python实现及原理
双条件排序代码
对应的Python实现为:
freq_words = sorted(hash, key=lambda x: (-hash[x], x))
原理拆解
- 频率降序的实现:Python的
sorted默认是升序排序,对频率取负(-hash[x])后,原本更大的频率会变成更小的负数,排序时会被优先放在前面,等价于频率降序。 - 字母升序的实现:当两个单词频率相同时,
-hash[x]的值相等,此时会比较元组的第二个元素x(即单词本身)。Python中字符串默认按Unicode编码升序比较,正好符合字母升序的要求。
多条件排序扩展(以3个条件为例)
如果需要增加更多排序条件,直接在key的元组中追加即可,排序优先级遵循元组的顺序。
比如新增规则:频率和字母都相同时,按单词长度升序排列,代码如下:
freq_words = sorted(hash, key=lambda x: (-hash[x], x, len(x)))
如果第三个条件需要降序,同样对值取负即可,比如按长度降序:
freq_words = sorted(hash, key=lambda x: (-hash[x], x, -len(x)))
关于Python3移除cmp参数的说明
Python3移除了cmp参数,因为key参数的效率更高(每个元素仅计算一次key值,而cmp需要多次比较)。如果确实需要自定义复杂比较逻辑,可以用functools.cmp_to_key将比较函数转换为key函数,但对于这类多条件排序,用元组作为key是更简洁高效的方案。
比如用cmp_to_key模拟你的JS逻辑:
from functools import cmp_to_key def compare(a, b): if hash[b] == hash[a]: return -1 if a < b else 1 # 字母升序,a更小则排前面 else: return hash[b] - hash[a] # 频率降序 freq_words = sorted(hash, key=cmp_to_key(compare))
内容的提问来源于stack exchange,提问作者disposable-kiwi
相关产品推荐
相关产品推荐

