首页 > 技术文章 > python3 sorted()函数 将 cmp函数转化为key

r1-12king 2021-12-13 15:57 原文

语法

sorted 语法:

sorted(iterable, key=None, reverse=False)

参数说明:

  • iterable -- 可迭代对象。
  • key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

 

用法:

普通排序

>>> sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5] 

反向排序

>>> example_list = [5, 0, 6, 1, 2, 7, 3, 4]
>>> sorted(example_list, reverse=True)
[7, 6, 5, 4, 3, 2, 1, 0]

二维list排序

>>> example_list = [5, 0, 6, 1, 2, 7, 3, 4]
>>> result_list = sorted(example_list, key=lambda x: x*-1)
>>> print(result_list)
[7, 6, 5, 4, 3, 2, 1, 0]

通过 key 的值来进行数组/字典的排序

>>>array = [{"age":20,"name":"a"},{"age":25,"name":"b"},{"age":10,"name":"c"}]
>>>array = sorted(array,key=lambda x:x["age"])
>>>print(array)

[{'age': 10, 'name': 'c'}, {'age': 20, 'name': 'a'}, {'age': 25, 'name': 'b'}]

多列排序

先按照成绩降序排序,相同成绩的按照名字升序排序:

>>> d1 = [{'name':'alice', 'score':38}, {'name':'bob', 'score':18}, {'name':'darl', 'score':28}, {'name':'christ', 'score':28}]
>>> l = sorted(d1, key=lambda x:(-x['score'], x['name']))
>>> print(l)

[{'name': 'alice', 'score': 38}, {'name': 'christ', 'score': 28}, {'name': 'darl', 'score': 28}, {'name': 'bob', 'score': 18}]

 

自定义排序

一般的 sorted 排序函数 都有相应的 cmp函数,用来定制化排序的比较方法。然而 python 3中的 sorted( ) 除去的cmp 参数,推荐使用 key。

Python中有相应的函数 支持将 cmp函数转化为key的值。

 1 import functools
 2 def tcmp(a,b):
 3     if a > b :
 4         return -1
 5     elif a < b :
 6         return 1
 7     else:
 8         return 0
 9         
10 nums = [1,2,3,4]
11 sorted_nums = sorted(nums, key = functools.cmp_to_key(tcmp))

Note:

1、functools.cmp_to_key() 将 cmp函数 转化为 key。

2、cmp函数的返回值 必须为 [1,-1,0]

例如:179. 最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

 

示例 1:

输入:nums = [10,2]
输出:"210"
示例 2:

输入:nums = [3,30,34,5,9]
输出:"9534330"
示例 3:

输入:nums = [1]
输出:"1"
示例 4:

输入:nums = [10]
输出:"10"

解答:

 1 class Solution(object):
 2     def largestNumber(self, nums):
 3         """
 4         :type nums: List[int]
 5         :rtype: str
 6         """
 7         import functools
 8 
 9         def com(a, b):
10             s1 = a + b
11             s2 = b + a
12             if s1 > s2:
13                 return 1
14             elif s1 == s2:
15                 return 0
16             else:
17                 return -1
18 
19         n = len(nums)
20         if n == 1:
21             return str(nums[-1])
22 
23         data = [str(i) for i in nums]
24 
25         d = sorted(data, key=functools.cmp_to_key(com))
26         res = ""
27         for r in d[::-1]:
28             res += r
29         return str(int(res))

注意:最后一行 『str(int(res))』是用来解决[0, 0]这一类用例的

 

str(int(res))

推荐阅读