python3 sorted()函数 将 cmp函数转化为key
语法
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))