输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
- [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])