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 相关文章推荐
Django静态资源URL STATIC_ROOT的配置方法
Nov 08 Python
Python对列表排序的方法实例分析
May 16 Python
Python实现简单截取中文字符串的方法
Jun 15 Python
Python搜索引擎实现原理和方法
Nov 27 Python
Python编程二分法实现冒泡算法+快速排序代码示例
Jan 15 Python
python实现朴素贝叶斯分类器
Mar 28 Python
Python中按值来获取指定的键
Mar 04 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
Jun 27 Python
Python制作微信好友背景墙教程(附完整代码)
Jul 17 Python
基于Python解密仿射密码
Oct 21 Python
OpenCV Python实现拼图小游戏
Mar 23 Python
解决python的空格和tab混淆而报错的问题
Feb 26 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 socke 向指定页面提交数据
2008/07/23 PHP
在PHP中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
ThinkPHP写第一个模块应用
2012/02/20 PHP
解析php中heredoc的使用方法
2013/06/17 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
2015/01/26 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
浅谈PHP中try{}catch{}的使用方法
2016/12/09 PHP
PHP实现的回溯算法示例
2017/08/15 PHP
AngularJS转换响应内容
2016/01/27 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
js实现淡入淡出轮播切换功能
2017/01/13 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
vue 解决遍历对象显示的顺序不对问题
2019/11/07 Javascript
vue渲染方式render和template的区别
2020/06/05 Javascript
[00:34]DOTA2上海特级锦标赛 Spirit战队宣传片
2016/03/04 DOTA
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
python解决字符串倒序输出的问题
2018/06/25 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
2020/06/12 Python
Python Pillow(PIL)库的用法详解
2020/09/19 Python
python xlsxwriter模块的使用
2020/12/24 Python
大学生简历中个人的自我评价
2013/10/06 职场文书
电子商务专员岗位职责
2013/12/11 职场文书
承诺书怎么写
2014/03/26 职场文书
应届大学生自荐书
2014/06/17 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
岗位工作说明书
2014/07/29 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
go类型转换及与C的类型转换方式
2021/05/05 Golang
ORM模型框架操作mysql数据库的方法
2021/07/25 MySQL
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技