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将IP地址在整型和字符串之间轻松转换
Mar 22 Python
Django添加favicon.ico图标的示例代码
Aug 07 Python
Win10下python 2.7.13 安装配置方法图文教程
Sep 18 Python
对python PLT中的image和skimage处理图片方法详解
Jan 10 Python
python腾讯语音合成实现过程解析
Aug 01 Python
Django ORM 常用字段与不常用字段汇总
Aug 09 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 Python
Python 最强编辑器详细使用指南(PyCharm )
Sep 16 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 Python
使用pandas 将DataFrame转化成dict
Dec 10 Python
python爬虫添加请求头代码实例
Dec 28 Python
查看keras的默认backend实现方式
Jun 19 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中CURL方法curl_setopt()函数的参数分享
2013/01/19 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
php实现微信企业转账功能
2018/10/02 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
JavaScript基本概念初级讲解论坛贴的学习记录
2009/02/22 Javascript
Javascript算符的优先级介绍
2013/03/20 Javascript
JS 添加千分位与去掉千分位的示例
2013/07/11 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
2014/06/05 Javascript
JavaScript检查某个function是否是原生代码的方法
2014/08/20 Javascript
jQuery实现Tab选项卡切换效果简单演示
2015/11/23 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
Bootstrap基本组件学习笔记之按钮组(8)
2016/12/07 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
2017/04/01 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
vue框架中props的typescript用法详解
2020/02/17 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
使用python编写监听端
2018/04/12 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
俄罗斯游戏商店:Buka
2020/03/01 全球购物
小学假期安全广播稿
2014/09/28 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
运动会新闻报道稿
2015/07/22 职场文书
大学迎新生欢迎词
2015/09/29 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书
Mysql效率优化定位较低sql的两种方式
2021/05/26 MySQL
Redis字典实现、Hash键冲突及渐进式rehash详解
2021/09/04 Redis