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之编写类之三子类
Oct 11 Python
Python切片知识解析
Mar 06 Python
Python字符串拼接的几种方法整理
Aug 02 Python
python 实现tar文件压缩解压的实例详解
Aug 20 Python
基于numpy.random.randn()与rand()的区别详解
Apr 17 Python
Django接收post前端返回的json格式数据代码实现
Jul 31 Python
详解Python中的正斜杠与反斜杠
Aug 09 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
Aug 12 Python
使用Python生成200个激活码的实现方法
Nov 22 Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 Python
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
Jun 05 Python
Python 视频画质增强
Apr 28 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操作mysql数据库类
2014/12/08 PHP
php使用Session和文件统计在线人数
2015/07/04 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
2016/06/17 PHP
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
谷歌showModalDialog()方法不兼容出现对话窗口的解决办法
2016/02/15 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
原生Javascript和jQuery做轮播图简单例子
2016/10/11 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
[49:11]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.20
2020/12/23 DOTA
python处理二进制数据的方法
2015/06/03 Python
python3中str(字符串)的使用教程
2017/03/23 Python
Python+树莓派+YOLO打造一款人工智能照相机
2018/01/02 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
Python从列表推导到zip()函数的5种技巧总结
2019/10/23 Python
python编写计算器功能
2019/10/25 Python
python opencv实现gif图片分解的示例代码
2019/12/13 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
Python使用Chrome插件实现爬虫过程图解
2020/06/09 Python
LightInTheBox西班牙站点:全球商品在线采购
2016/09/22 全球购物
高一政治教学反思
2014/01/28 职场文书
历史专业大学生职业生涯规划书
2014/03/13 职场文书
入党积极分子学习优秀共产党员先进事迹思想汇报
2014/09/13 职场文书
大学生翘课检讨书范文
2014/10/06 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
python opencv旋转图片的使用方法
2021/06/04 Python
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android
索尼ICF-36收音机评测
2022/04/30 无线电
Redis 限流器
2022/05/15 Redis