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

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))

原理拆解

  1. 频率降序的实现:Python的sorted默认是升序排序,对频率取负(-hash[x])后,原本更大的频率会变成更小的负数,排序时会被优先放在前面,等价于频率降序。
  2. 字母升序的实现:当两个单词频率相同时,-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:50:22