[Python]-输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

  • [3, 30, 34, 5, 9]
  • 一、需要对列表进行排列,取出相邻的两个元素,组成一个数,例如:ab , 如果ab < ba;则相应权重 a < b;使用这个规则对列表进行排序,得到的排序结果组合起来就是数字最小的一个。
  • 二、在Python2中的函数sorted(data, cmp=None, key=None, reverse=False)
    • 其中data 是等待排序的数据
    • cmp是带两个参数的比较函数:cmp(x, y);当 x < y时返回负数;当 x = y 时返回0;当x > y时返回正数。默认由小到大,返回值应该为负数。
    • (cmp函数会确定待排序列表中元素的权重,当cmp函数的返回值为 -1 时,表示权重 x < y ; 返回值为 0 时,权重 x = y; 返回值为 -1 时,权重 x > y)
    • --->由cmp函数确定待排序列表中的元素的权重, 其后sorted()函数会根据权重值对列表重新排序。
    • key是带有一个参数的函数:key(x),用来提取每个函数的值进行比较,默认值为None ,直接比较每个元素。
  • 总结一下,在sorted(data, cmp=None, key=None, reverse=False)函数中:
    • data是想要排序的itrrater,例如一个列表,列表中的每个元素可能是字典(需要设置参数key)
    • reverse, 决定是升序还是降序
    • key参数需要传递一个函数,有一个参数,一个返回值,可以对传入的iterrater的元素进行变换,然后按照返回的结果进行排序。
    • cmp(x, y)函数决定比较时元素权重谁大时小,会将iterrater中元素两两进行比较,当返回 -1 时认定权重 x < y;-->我们为您可以通过自定义cmp()函数来自定义比较规则.
Python2中可以重新定义比较规则
def sorted_role(x, y):              # 比较规则函数
    if int(str(x) + str(y)) < int(str(y) + str(x)):   # 对列表中两个元素拼接成的数字进行比较
        return -1               # ,确定相邻两个元素的先后位置,(返回-1 表示 前边权重小,后边权重大)
    if int(str(x) + str(y)) == int(str(y) + str(x)):# 使得列表顺序为组成数字最小的顺序
        return 0
    if int(str(x) + str(y)) > int(str(y) + str(x)):
        return 1
        
def PrintMinNumber(numbers):
    if not numbers:         # 列表中没有数据返回空值
        return ""
    numbers = sorted(numbers, cmp = sorted_role)    # 重新定义的排序规则生效。(权重由小到大依次排列)
    return ''.join([str(i) for i in numbers])       #将排好序的列表元素转化为字符串拼接起来,返回
Python3中的sort()函数
  • Python3中的sort()函数没有了cmp参数,需要使用from functools import cmp_to_key
from functools import cmp_to_key    # 导入需要使用的工具

def sorted_role(x, y):              # 重新定义的比较规则函数
    if int(str(x) + str(y)) < int(str(y) + str(x)):
        return -1                   # xy - yx < 0 时,应该 x在前, y 在后, 返回负值
    if int(str(x) + str(y)) == int(str(y) + str(x)):
        return 0
    if int(str(x) + str(y)) > int(str(y) + str(x)):
        return 1                    # xy - yx > 0 时,应该 y在前, x 在后, 返回正值


def PrintMinNumber(numbers):

    #key=cmp_to_key(sorted_role):启动新的排序规则
    numbers.sort(key=cmp_to_key(sorted_role))   
    return ''.join([str(i) for i in numbers])
  • 简化写法
from functools import cmp_to_key    # 导入需要使用的工具
def PrintMinNumber(numbers):
    # 定义匿名函数:当 ab - ba < 0时,a应该在前,b在后,返回负值。
    cmp = lambda a, b: int(str(a) + str(b)) - int(str(b) + str(a))
    numbers.sort(key=cmp_to_key(cmp))
    return ''.join([str(i) for i in numbers])

你可能感兴趣的:([Python]-输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。)