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的Tkinter编写登陆注册界面
Jun 30 Python
Python实现的快速排序算法详解
Aug 01 Python
使用C++扩展Python的功能详解
Jan 12 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
python交互界面的退出方法
Feb 16 Python
实例讲解Python3中abs()函数
Feb 19 Python
python机器学习库scikit-learn:SVR的基本应用
Jun 26 Python
Django中自定义admin Xadmin的实现代码
Aug 09 Python
python tkinter图形界面代码统计工具(更新)
Sep 18 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
Jan 20 Python
python使用信号量动态更新配置文件的操作
Apr 01 Python
python中操作文件的模块的方法总结
Feb 04 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
php microtime获取浮点的时间戳
2010/02/21 PHP
php实现mysql数据库分表分段备份
2015/06/18 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
Javascript的&&和||的另类用法
2014/07/23 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
jQuery+CSS3+Html5实现弹出层效果实例代码(附源码下载)
2016/05/16 Javascript
Javascript中判断一个值是否为undefined的方法详解
2016/09/28 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
详解Angular系列之变化检测(Change Detection)
2018/02/26 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
2018/03/01 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
vue 解决异步数据更新问题
2019/10/29 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
python 实时遍历日志文件
2016/04/12 Python
你真的了解Python的random模块吗?
2017/12/12 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
五种Python转义表示法
2020/11/27 Python
欧舒丹英国官网:购买欧舒丹护手霜等明星产品
2017/01/17 全球购物
澳大利亚最超值的自行车之家:Reid Cycles
2019/03/24 全球购物
linux面试题参考答案(3)
2012/09/13 面试题
中学生自我鉴定
2014/02/04 职场文书
公司离职证明标准格式
2014/11/18 职场文书
公司员工体检通知
2015/04/21 职场文书
2016学校先进党组织事迹材料
2016/02/29 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
七年级话题作文之执着
2019/11/19 职场文书
导游词之阆中古城
2019/12/23 职场文书
一文搞懂redux在react中的初步用法
2021/06/09 Javascript
Oracle 临时表空间SQL语句的实现
2021/09/25 Oracle
Fluentd搭建日志收集服务
2022/09/23 Servers