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

如何在sort/sorted函数的key参数中轻松实现字符串等类型的逆序排序?

多关键字混合排序(含字符串等非数值类型)的实现方法

当排序关键字包含字符串这类无法用一元-反转排序顺序的类型时,没法直接套用数值类型的技巧,这里提供两种实用解决方案:

方法1:用functools.cmp_to_key自定义比较逻辑

这是最通用的方案,不管什么数据类型,都能通过自定义比较函数实现任意排序规则。

比如针对你给出的strarr列表,假设需求是第一个元素升序、第二个元素降序,可以这么写:

from functools import cmp_to_key

strarr = [('jam', 'Peter'), ('apple', 'sf')]

def compare_items(a, b):
    # 先按第一个元素升序比较
    if a[0] < b[0]:
        return -1
    elif a[0] > b[0]:
        return 1
    # 第一个元素相等时,按第二个元素降序比较
    else:
        if a[1] > b[1]:
            return -1
        elif a[1] < b[1]:
            return 1
        return 0

strarr.sort(key=cmp_to_key(compare_items))
print(strarr)  # 输出结果: [('apple', 'sf'), ('jam', 'Peter')]

这里的规则很简单:比较函数返回负数,就把a排在b前面;返回正数,就把b排在a前面;返回0则两者顺序不变。所以第二个元素要降序时,反过来比较a[1]和b[1]即可。

方法2:针对字符串的快速转换技巧

如果只是字符串类型要降序,也可以把字符串转换成反向的数值元组来实现,不用写复杂的比较函数。

同样按第一个元素升序、第二个元素降序的需求,key函数可以这么写:

strarr = [('jam', 'Peter'), ('apple', 'sf')]
strarr.sort(key=lambda x: (x[0], tuple(-ord(c) for c in x[1])))
print(strarr)  # 输出结果一致: [('apple', 'sf'), ('jam', 'Peter')]

原理是把字符串的每个字符转换成ASCII码后取反,这样原本大的字符会变成更小的数值,排序时自然就实现了降序。不过这种方法只适用于能转成数值序列的类型,通用性不如第一种方法。

内容的提问来源于stack exchange,提问作者wangjianyu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:02:29