Python自定义sorted排序实现方法详解


Posted in Python onSeptember 18, 2020

题目

输入一个正整数数组,把数组里面的所有属猪拼接起来成为一个数打印能拼接起来的所有数字中最大/最小的那个。

思考

直观想法就是求出这个数组中所有数字的全排列,然后拼接起来,再比较大小即可,当然复杂度过高。

另一个想法,我们可以定义一个排序规则,如下:
  如果两个数m,n能拼接成数字mn,nm,如果mn>nm,则m应该在n前面,反之亦然

根据这个排序规则,我们可以重新排列数组,将排列好的数组拼接起来输出即可'为了方便比较,并且防止数据溢出(比如C语言),采用字符串的方式拼接。我们很容易可以写出如下代码:

def compare(strNum1, strNum2):
  newStrNum1 = strNum1 + strNum2
  newStrNum2 = strNum2 + strNum1
  if newStrNum2 > newStrNum1:
    return -1
  elif newStrNum2 == newStrNum1:
    return 0
  else:
    return 1

问题

排序规则定义好了,但是问题来了,一般的 sorted 排序函数 都有相应的 cmp函数,用来定制化排序的比较方法。但是python3的sorted函数已经删去了cmp参数,真不能跑去用python2吧

解决方案

由于python3中sorted函数除去compare函数,无法自定义排序规则,所以使用内置的函数,将cmp函数转化为key的值

Note:

functools.cmp_to_key() 将 cmp函数 转化为 key。

cmp函数的返回值 必须为 [1,-1,0]

python

from functools import cmp_to_key

def compare(strNum1, strNum2):
	"""
	返回最小排列的定义,如果需要最大,将返回值的+1、-1调换即可
	"""
  newStrNum1 = strNum1 + strNum2
  newStrNum2 = strNum2 + strNum1
  if newStrNum2 > newStrNum1:
    return -1
  elif newStrNum2 == newStrNum1:
    return 0
  else:
    return 1

def print_min_nums(nums):
  if not nums:
    return 0

  arr = [str(i) for i in nums]
  newarr = sorted(arr,key=cmp_to_key(compare))
  return "".join(newarr)


if __name__ == '__main__':
  print(print_min_nums([3,32,321]))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
安装python时MySQLdb报错的问题描述及解决方法
Mar 20 Python
Python实现找出数组中第2大数字的方法示例
Mar 26 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
Apr 06 Python
详解Python 解压缩文件
Apr 09 Python
PyQt QCombobox设置行高的方法
Jun 20 Python
pycharm激活码有效到2020年11月底
Sep 18 Python
python实点云分割k-means(sklearn)详解
May 28 Python
python爬虫调度器用法及实例代码
Nov 30 Python
Django 如何实现文件上传下载
Apr 08 Python
golang特有程序结构入门教程
Jun 02 Python
详解Python类和对象内容
Jun 22 Python
python爬虫爬取网页数据并解析数据
Sep 18 #Python
Python实现迪杰斯特拉算法过程解析
Sep 18 #Python
Python 操作 MySQL数据库
Sep 18 #Python
python实现人工蜂群算法
Sep 18 #Python
Python猫眼电影最近上映的电影票房信息
Sep 18 #Python
python实现简单遗传算法
Sep 18 #Python
详解python 支持向量机(SVM)算法
Sep 18 #Python
You might like
adodb与adodb_lite之比较
2006/12/31 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
PHP实现阳历到农历转换的类实例
2015/03/07 PHP
PHP连接操作access数据库实例
2015/03/30 PHP
thinkphp实现图片上传功能
2016/01/13 PHP
PHP计算日期相差天数实例分析
2016/02/23 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
2020/10/28 PHP
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
jQuery 阴影插件代码分享
2012/01/09 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
JS+canvas绘制的动态机械表动画效果
2017/09/12 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
浅谈Python爬取网页的编码处理
2016/11/04 Python
Python语言描述连续子数组的最大和
2018/01/04 Python
在python中将字符串转为json对象并取值的方法
2018/12/31 Python
学习python可以干什么
2019/02/26 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
2019/07/23 Python
Django分页功能的实现代码详解
2019/07/29 Python
详解Pycharm出现out of memory的终极解决方法
2020/03/03 Python
Python3与fastdfs分布式文件系统如何实现交互
2020/06/23 Python
Charles&Keith美国官方网站:新加坡快时尚鞋类和配饰零售商
2019/11/27 全球购物
Flesh Beauty官网:露华浓集团旗下彩妆品牌
2021/02/15 全球购物
优秀应届毕业生自荐信
2013/11/16 职场文书
2014年征兵标语
2014/06/20 职场文书