Python中将比较函数转换为键功能的方法
我们在对数据排序时,经常会用到list.sort()方法和sorted()方法。
list.sort(cmp=None, key=None, reverse=False),其中参数cmp表示排序的函数,key 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序,reverse表示排序规则。
sorted(iterable, cmp=None, key=None, reverse=False),sorted()的参数与list.sort()的参数定义相同,但是sorted()不仅仅应用在list上。
当我们对[1,3,2,4]这样简单的列表进行排序时,用list.sort()和sorted()可以简单解决,但是如果我们要求这个列表中的元素可以组成的数中最小的数呢?如果是求[61,27,30,34,5,9]中的元素可以组成的数中最小的数呢?
for循环方法:
def min_com(nums):
nums = [str(i) for i in nums]
for i in range(0, len(nums)-1):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] > nums[j] + nums[i]:
nums[i], nums[j] = nums[j], nums[i]
return ''.join(nums)
print(min_com([61,27,30,34,5,9]))
print(min_com([1,3,2,4]))
运行结果:
2730345619
1234
使用for循环方法实现这个功能的话,时间复杂度为O(n^2),当数据很大时是需要很多时间才能计算出结果。
为了更好的解决这类问题,我们可以使用functools模块中的cmp_to_key()方法
functools模块中的cmp_to_key()方法
cmp_to_key(func),其中参数func就是一个比较函数,com_to_key()的作用就是将比较函数转化成一个键功能。
我们可以通过com_to_key()将一个比较函数(多个参数)转换为键功能,传给sorted()的参数key,消除key只有一个参数的缺点,实现上述问题解决方法的优化。
优化后的方法:
from functools import cmp_to_key
# 比较规则函数
def cmp(x, y):
a, b = x + y, y + x
if a < b:
return 1
elif a > b:
return -1
else:
return 0
def min_combination(nums):
nums = [str(i) for i in nums]
newnums = sorted(nums, key=cmp_to_key(cmp), reverse=True) # 键功能排序,cmp_to_key()将比较功能转换成键功能
return ''.join(newnums)
print(min_combination([3,30,34,5,9]))
print(min_combination([1,3,2,4]))
运行结果:
2730345619
1234
使用手册:https://docs.python.org/3.7/library/functools.html#module-functools