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的Django框架下搭建的BLOG添加RSS功能的教程
Apr 08 Python
Python使用xlrd模块操作Excel数据导入的方法
May 26 Python
Python入门_条件控制(详解)
May 16 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
Mar 01 Python
如何通过Python实现标签云算法
Jul 02 Python
django获取from表单multiple-select的value和id的方法
Jul 19 Python
pytorch:torch.mm()和torch.matmul()的使用
Dec 27 Python
如何通过Django使用本地css/js文件
Jan 20 Python
Django+Uwsgi+Nginx如何实现生产环境部署
Jul 31 Python
python 写一个性能测试工具(一)
Oct 24 Python
python调用win32接口进行截图的示例
Nov 11 Python
Python实现双向链表
May 25 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
PHP中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
2012/06/17 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
解析WordPress中的post_class与get_post_class函数
2016/01/04 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
JavaScript 动态创建VML的方法
2009/10/14 Javascript
js中创建对象的几种方式示例介绍
2014/01/26 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
原生js实现日期联动
2015/01/12 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
2016/12/18 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
Python装饰器入门学习教程(九步学习)
2016/01/28 Python
python基础while循环及if判断的实例讲解
2017/08/25 Python
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
jupyter notebook运行命令显示[*](解决办法)
2020/05/18 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
Python Unittest原理及基本使用方法
2020/11/06 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
Pycharm安装python库的方法
2020/11/24 Python
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
SQL中where和having的区别
2012/06/17 面试题
介绍一下Java的安全机制
2012/06/28 面试题
Unix如何添加新的用户
2014/08/20 面试题
保护环境倡议书300字
2014/05/19 职场文书
迁户口计划生育证明
2014/10/19 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
建立共青团委员会的请示
2019/04/02 职场文书
详解Python中下划线的5种含义
2021/07/15 Python
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python