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使用爬虫猜密码
Feb 19 Python
python实现各进制转换的总结大全
Jun 18 Python
python八皇后问题的解决方法
Sep 27 Python
python 中的列表生成式、生成器表达式、模块导入
Jun 19 Python
python中hasattr()、getattr()、setattr()函数的使用
Aug 16 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
pygame编写音乐播放器的实现代码示例
Nov 19 Python
Python数据可视化:泊松分布详解
Dec 07 Python
Python修改列表值问题解决方案
Mar 06 Python
python实现程序重启和系统重启方式
Apr 16 Python
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 Python
PyTorch 如何自动计算梯度
May 23 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
实现“上一页”和“下一页按钮
2006/10/09 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
Yii2第三方类库插件Imagine的安装和使用
2017/07/06 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
javascript 类型判断代码分析
2010/03/28 Javascript
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
javascript 实现子父窗体互相传值的简单实例
2014/02/17 Javascript
jQuery动态修改超链接地址的方法
2015/02/13 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
javascript css红色经典选项卡效果实现代码
2016/05/17 Javascript
JS如何生成一个不重复的ID的函数
2016/12/25 Javascript
深入理解ES6中let和闭包
2018/02/22 Javascript
p5.js入门教程之鼠标交互的示例
2018/03/16 Javascript
webpack4+react多页面架构的实现
2018/10/25 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
[02:08]2014DOTA2国际邀请赛 430专访:力争取得小组前二
2014/07/11 DOTA
[01:03:27]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[01:47]2018年度DOTA2最具人气解说-完美盛典
2018/12/16 DOTA
[39:18]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第二场 12.17
2020/12/19 DOTA
Python 解析XML文件
2009/04/15 Python
python 字符串格式化代码
2013/03/17 Python
python如何删除文件中重复的字段
2019/07/16 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
Python操作word文档插入图片和表格的实例演示
2020/10/25 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
食堂标语大全
2014/06/11 职场文书
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
房地产置业顾问工作总结
2015/10/23 职场文书
歌咏比赛口号大全
2015/12/25 职场文书
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
分享Python异步爬取知乎热榜
2022/04/12 Python