Python中将比较函数转换为键功能的方法

  1. 我们在对数据排序时,经常会用到list.sort()方法和sorted()方法。
  2. list.sort(cmp=None, key=None, reverse=False),其中参数cmp表示排序的函数,key 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序,reverse表示排序规则。
  3. sorted(iterable, cmp=None, key=None, reverse=False),sorted()的参数与list.sort()的参数定义相同,但是sorted()不仅仅应用在list上。
  4. 当我们对[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