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 相关文章推荐
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
Jun 25 Python
详解Python中的各种函数的使用
May 24 Python
使用Python3编写抓取网页和只抓网页图片的脚本
Aug 20 Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
Jun 11 Python
TensorFlow 模型载入方法汇总(小结)
Jun 19 Python
Python SVM(支持向量机)实现方法完整示例
Jun 19 Python
python实现三次样条插值
Dec 17 Python
详解django中url路由配置及渲染方式
Feb 25 Python
python集合常见运算案例解析
Oct 17 Python
Python基于pandas爬取网页表格数据
May 11 Python
利用python实现后端写网页(flask框架)
Feb 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中使用Imagick实现各种图片效果实例
2015/01/21 PHP
php版交通银行网银支付接口开发入门教程
2016/09/26 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
2017/06/06 PHP
JavaScript 函数式编程的原理
2009/10/16 Javascript
JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符
2012/10/11 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
javascript正则表达式基础知识入门
2015/04/20 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
2016/03/25 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
2017/10/27 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
layui从数据库中获取复选框的值并默认选中方法
2018/08/15 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
解决vue-router 二级导航默认选中某一选项的问题
2019/11/01 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
2020/04/08 Javascript
Javascript call及apply应用场景及实例
2020/08/26 Javascript
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
2020/12/25 Vue.js
[49:20]2014 DOTA2国际邀请赛中国区预选赛5.21 CIS VS TongFu
2014/05/22 DOTA
举例讲解Python中装饰器的用法
2015/04/27 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
Python 中的 else详解
2016/04/23 Python
python实现媒体播放器功能
2018/02/11 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
2018/02/18 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
2018/11/20 Python
Python3多线程基础知识点
2019/02/19 Python
pandas中的series数据类型详解
2019/07/06 Python
大学本科毕业生的自我鉴定范文
2013/11/19 职场文书
中专生自我鉴定书范文
2013/12/28 职场文书
二手房购房意向书范本
2014/04/01 职场文书
企业党员一句话承诺
2014/05/30 职场文书
2015年人事工作总结范文
2015/04/09 职场文书
小学五年级班主任工作经验交流材料
2015/11/02 职场文书
python tkinter Entry控件的焦点移动操作
2021/05/22 Python
javascript实现计算器功能详解流程
2021/11/01 Javascript
Nginx速查手册及常见问题
2022/04/07 Servers