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数据类型转换函数总结
Mar 11 Python
Python实现单词翻译功能
Jun 06 Python
Python Logging 日志记录入门学习
Jun 02 Python
python+opencv实现高斯平滑滤波
Jul 21 Python
我喜欢你 抖音表白程序python版
Apr 07 Python
Python shutil模块用法实例分析
Oct 02 Python
Python 日志logging模块用法简单示例
Oct 18 Python
解决Tensorflow占用GPU显存问题
Feb 03 Python
Python pickle模块常用方法代码实例
Oct 10 Python
Python 制作查询商品历史价格的小工具
Oct 20 Python
python 合并多个excel中同名的sheet
Jan 22 Python
利用Python批量识别电子账单数据的方法
Feb 08 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从字符串创建函数的方法
2015/03/16 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
2016/05/31 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
PHP实现根据数组某个键值大小进行排序的方法
2018/03/13 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
Js为表单动态添加节点内容的方法
2015/02/10 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
学习JavaScript设计模式之代理模式
2016/01/12 Javascript
原生JS实现首页进度加载动画
2016/09/14 Javascript
JavaScript制作简单的框选图表
2017/05/15 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
简单实现jquery隔行变色
2017/11/09 jQuery
jquery ztree实现右键收藏功能
2017/11/20 jQuery
原生JS实现ajax与ajax的跨域请求实例
2017/12/01 Javascript
vue中的计算属性的使用和vue实例的方法示例
2017/12/04 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
Python中字典映射类型的学习教程
2015/08/20 Python
Python实现对象转换为xml的方法示例
2017/06/08 Python
详解关于Django中ORM数据库迁移的配置
2018/10/08 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
德国高尔夫商店:Par71.de
2020/11/29 全球购物
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
中学教师自我鉴定
2014/02/07 职场文书
七一建党节演讲稿
2014/09/11 职场文书
小学语文教师年度考核个人总结
2015/02/05 职场文书
品质保证书格式
2015/02/28 职场文书
学子宴致辞大全
2015/07/27 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python
Python实现抖音热搜定时爬取功能
2022/03/16 Python