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使用socket向客户端发送数据的方法
Apr 29 Python
django模型层(model)进行建表、查询与删除的基础教程
Nov 21 Python
用python处理MS Word的实例讲解
May 08 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
python验证身份证信息实例代码
May 06 Python
Python中单线程、多线程和多进程的效率对比实验实例
May 14 Python
Python检查 云备份进程是否正常运行代码实例
Aug 22 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
Feb 28 Python
django restframework serializer 增加自定义字段操作
Jul 15 Python
Python中免验证跳转到内容页的实例代码
Oct 23 Python
python 写一个水果忍者游戏
Jan 13 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
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
2013/01/06 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
jQuery 页面 Mask实现代码
2010/01/09 Javascript
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
可以用鼠标拖动的DIV实现思路及代码
2013/10/21 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
js中this的用法实例分析
2015/01/10 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
js实现一键复制功能
2017/03/16 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
2017/08/15 Javascript
Vue-Router基础学习笔记(小结)
2018/10/15 Javascript
layui: layer.open加载窗体时出现遮罩层的解决方法
2019/09/26 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
[53:20]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 VG vs OG
2018/04/03 DOTA
Python排序搜索基本算法之归并排序实例分析
2017/12/08 Python
对Python 除法负数取商的取整方式详解
2018/12/12 Python
Python零基础入门学习之输入与输出
2019/04/03 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
Python遍历字典方式就实例详解
2019/12/28 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
Python基于traceback模块获取异常信息
2020/07/23 Python
python爬取天气数据的实例详解
2020/11/20 Python
美发店5.1活动方案
2014/01/24 职场文书
学生请假条格式
2014/04/11 职场文书
公司股东合作协议书
2014/09/14 职场文书
大一新生检讨书
2014/10/29 职场文书
2014年统计工作总结
2014/11/21 职场文书
新生入学欢迎词
2015/01/26 职场文书
幼儿园开学报名通知
2015/07/16 职场文书
排球赛新闻稿
2015/07/17 职场文书
springboot临时文件存储目录配置方式
2021/07/01 Java/Android