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常用内置函数总结
Feb 08 Python
对Python中range()函数和list的比较
Apr 19 Python
解决python "No module named pip" 的问题
Oct 13 Python
解决Mac下首次安装pycharm无project interpreter的问题
Oct 29 Python
Python面向对象基础入门之编码细节与注意事项
Dec 11 Python
Python根据成绩分析系统浅析
Feb 11 Python
python2.7使用plotly绘制本地散点图和折线图
Apr 02 Python
Python之修改图片像素值的方法
Jul 03 Python
Python学习笔记之Django创建第一个数据库模型的方法
Aug 07 Python
如何基于Python实现自动扫雷
Jan 06 Python
Django项目创建及管理实现流程详解
Oct 13 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 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
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
2011/06/30 PHP
php中substr()函数参数说明及用法实例
2014/11/15 PHP
PHP脚本自动识别验证码查询汽车违章
2016/12/20 PHP
php实现自定义中奖项数和概率的抽奖函数示例
2017/05/26 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
javascript 导出数据到Excel(处理table中的元素)
2009/12/18 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
利用JS生成博文目录及CSS定制博客
2016/02/10 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
2017/02/10 Javascript
探究react-native 源码的图片缓存问题
2017/08/24 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
Typescript的三种运行方式(小结)
2019/09/18 Javascript
Vue实现简易计算器
2020/02/25 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
2020/08/06 Javascript
[43:35]TI4 循环赛第二日Liquid vs Fnatic
2014/07/11 DOTA
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
python 字符串split的用法分享
2013/03/23 Python
Python3.0与2.X版本的区别实例分析
2014/08/25 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
python将数据插入数据库的代码分享
2020/08/16 Python
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
国庆节文艺活动方案
2014/02/03 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
我的长征观后感
2015/06/09 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书