如何在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
相关产品推荐
相关产品推荐

