Python对两个有序列表进行合并和排序的例子


Posted in Python onJune 13, 2014

假设有2个有序列表l1、l2,如何效率比较高的将2个list合并并保持有序状态,这里默认排序是正序。

思路是比较简单的,无非是依次比较l1和l2头部第一个元素,将比较小的放在一个新的列表中,以此类推,直到所有的元素都被放到新的列表中。

考虑2个列表l1 = [2], l2 = [1],如何将他们合并呢?(注意:下面实现会改变l1和l2本来的值)

def signle_merge_sort(l1, l2):
    tmp = []
    if l1[0] < l2[0]:
        tmp.append(l1[0])
        tmp.extend(l2)
        del l2[0]
    else:
        tmp.append(l2[0])
        tmp.extend(l1)
        del l1[0]
    return tmp

这真的只能处理一个元素的情形,还不能解决问题,不过好歹我们有一个大概的思路了。如果有列表中2个元素,上面的方法就不行了。我们需要解决边界判断问题,即当l1或者l2有一个为空的时,将剩下的一个list加到排序结果的尾部。然后确保函数每次调用只处理一个元素,通过递归来解决问题。
def recursion_merge_sort1(l1, l2):
    tmp = []
    if len(l1) == 0:
        tmp.extend(l2)
        return tmp
    elif len(l2) == 0:
        tmp.extend(l1)
        return tmp
    else:
        if l1[0] < l2[0]:
            tmp.append(l1[0])
            del l1[0]
        else:
            tmp.append(l2[0])
            del l2[0]
        tmp += recursion_merge_sort1(l1, l2)
    return tmp

上面的程序有2个问题:if判断太多;每次都要初始化tmp,对内存使用似乎不太友好。考虑到程序在l1或者l2有一个为空的时候就终止,可以稍微改写一下:
def _recursion_merge_sort2(l1, l2, tmp):
    if len(l1) == 0 or len(l2) == 0:
        tmp.extend(l1)
        tmp.extend(l2)
        return tmp
    else:
        if l1[0] < l2[0]:
            tmp.append(l1[0])
            del l1[0]
        else:
            tmp.append(l2[0])
            del l2[0]
        return _recursion_merge_sort2(l1, l2, tmp)
def recursion_merge_sort2(l1, l2):
    return _recursion_merge_sort2(l1, l2, [])

但是对于Python而言,即使是尾递归,效率也不是那么高,为了避免爆栈,通常还是会用循环来做,再稍微改写一下:
def loop_merge_sort(l1, l2):
    tmp = []
    while len(l1) > 0 and len(l2) > 0:
        if l1[0] < l2[0]:
            tmp.append(l1[0])
            del l1[0]
        else:
            tmp.append(l2[0])
            del l2[0]
    tmp.extend(l1)
    tmp.extend(l2)
    return tmp

今天栽了个坑,好好反省,就是这样。
Python 相关文章推荐
python实现堆栈与队列的方法
Jan 15 Python
Python使用SocketServer模块编写基本服务器程序的教程
Jul 12 Python
Python3.6笔记之将程序运行结果输出到文件的方法
Apr 22 Python
使用Python进行体育竞技分析(预测球队成绩)
May 16 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
Jun 05 Python
python实现H2O中的随机森林算法介绍及其项目实战
Aug 29 Python
学python安装的软件总结
Oct 12 Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
Feb 18 Python
Python使用Pygame绘制时钟
Nov 29 Python
Python实现Appium端口检测与释放的实现
Dec 31 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
Jan 09 Python
用Python输出一个杨辉三角的例子
Jun 13 #Python
Python 的 with 语句详解
Jun 13 #Python
python学习笔记:字典的使用示例详解
Jun 13 #Python
Python urlopen()函数 示例分享
Jun 12 #Python
python教程之用py2exe将PY文件转成EXE文件
Jun 12 #Python
Python struct模块解析
Jun 12 #Python
深度剖析使用python抓取网页正文的源码
Jun 11 #Python
You might like
法兰绒滤网冲泡
2021/03/03 冲泡冲煮
基于PHP选项与信息函数的使用详解
2013/05/10 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
2013/06/28 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
JAVASCRIPT style 中visibility和display之间的区别
2010/01/22 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
bootstrapfileinput实现文件自动上传
2016/11/08 Javascript
Angularjs中使用指令绑定点击事件的方法
2017/03/30 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
深入探究node之Transform
2017/07/20 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
vue 中this.$set 动态绑定数据的案例讲解
2021/01/29 Vue.js
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
python将字符串list写入excel和txt的实例
2019/07/20 Python
Python的垃圾回收机制详解
2019/08/28 Python
python为什么要安装到c盘
2020/07/20 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
小学二年级数学教学计划
2015/01/20 职场文书
2015年体育教师个人工作总结
2015/05/12 职场文书
红白喜事主持词
2015/07/06 职场文书
2019年手机市场的调研报告2篇
2019/10/10 职场文书
导游词之四川熊猫基地
2020/01/13 职场文书
python爬虫selenium模块详解
2021/03/30 Python
MySQL 如何分析查询性能
2021/05/12 MySQL
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS
Python实现简单的俄罗斯方块游戏
2021/09/25 Python
Python 统计序列中元素的出现频度
2022/04/26 Python