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

这篇文章主要介绍了Python对两个有序列表进行合并和排序的例子,最终代码经过不断优化,小编非常满意,需要的朋友可以参考下

假设有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对两个有序列表进行合并和排序的例子相关推荐

  1. python 找到两个排序数组的中位数_Python查找两个有序列表中位数的方法【基于归并算法】...

    本文实例讲述了Python查找两个有序列表中位数的方法.,具体如下: 今天做到的一个机试题目,很简单,这里简单记录一下: 我用的是归并的思想,当然还可以用递归的方法,下面是具体实现: #!usr/bi ...

  2. python两个列表合并 从小到大排列_Python对两个有序列表进行合并和排序的例子...

    假设有2个有序列表l1.l2,如何效率比较高的将2个list合并并保持有序状态,这里默认排序是正序. 思路是比较简单的,无非是依次比较l1和l2头部第一个元素,将比较小的放在一个新的列表中,以此类推, ...

  3. 用c语言编写两个有序数组合并,C++实现两个有序数组的合并

    本文实例为大家分享了C++实现两个有序数组合并的具体代码,供大家参考,具体内容如下 剑指offer面试题5延展题: 问题:有两个排序的数组A1和A2,内存在A1的末尾有足够多的空间容纳A2.请实现一个 ...

  4. python合并两个有序列表(list)

    python合并两个有序列表(list) 原来的列表是有序的合并之后的列表也要是有序的. 很多时候,我们会遇到一个问题,我们希望使用归并排序的归并函数,这是一个经典问题,在竞争性编程中经常出现.这种类 ...

  5. Python合并两个有序列表

    提出要求: 合并两个有序列表 例如: L1=[23,45,67,77,78,80,90] L2=[4,11,26,33,42,61,80] 解决方法: 方法1:使用Python自带的extend()方 ...

  6. 两个有序数组的合并,python版

    看到其他部门的笔试题,发现有这个题目:两个有序数组的合并,于是尝试着用python写出来 关键: 1.两个数组已经排序好,所以内部无需比较,比较都是存在于两个数组之间 2.比较结束后,需要将其中一个数 ...

  7. 第七章第三十一题(合并两个有序列表)(Merge two ordered tables)

    #第七章第三十一题(合并两个有序列表)(Merge two ordered tables) **7.31(合并两个有序列表)编写下面的方法,将两个有序列表变成一个新的有序列表. public stat ...

  8. 编写下面的函数合并两个有序列表构成一个新的有序列表: def merge(list1,list2): 编写测试程序提示用户输入两个有序列表,然后显式合并后的有序列表。

    题目内容:编写下面的函数合并两个有序列表构成一个新的有序列表:def merge(list1,list2):编写测试程序提示用户输入两个有序列表,然后显式合并后的有序列表.要求:不允许使用系统提供的s ...

  9. c语言实现两个有序链表的合并(代码示例)

    c语言实现两个有序链表的合并: 现有两个有序单链表,通过代码实现将两个单链表合并为一个有序的新表,要求使用旧表的空间,不能新分配内存 #include #include typedef struct ...

最新文章

  1. python实现tcp发包_python 多线程tcp udp发包 Dos工具。
  2. 上海Uber优步司机奖励政策(1月18日~1月24日)
  3. Sharepoin学习笔记—架构系列—06 Sharepoint服务(Services)与服务应用程序框架(Service Application Framework) 1
  4. 如何快速下载CentOS7镜像
  5. 听听优秀的人讲 AI!带你探知目标检测以及分割的现状和挑战
  6. 手机数控模拟器安卓版_CNC模拟器安卓中文版
  7. 打印机不弹出打印窗口_打印CAD图纸总是留白?做好这个操作,能打印出你想要的CAD图纸...
  8. iOS开发中对音效和音乐播放的简单实现
  9. 2016年人人网笔试题
  10. java项目启动就调用方法_Java项目启动时执行指定方法的几种方式
  11. c语言用数组发送大写字母怎么读,【C语言】(数组)C语言字符串中的小写字母转换为大写字母...
  12. 华为 A800-9000 服务器 离线安装MindX DL 可视化环境+监控
  13. cnn kaggle仙人掌_我如何开发可识别情绪并闯入Kaggle前10名的CNN
  14. Head First 系列图书资源-PDF网盘下载(更新中)
  15. 树莓派pxe网络启动官方文档(译文)
  16. 【web前端开发教程】
  17. hiho 1613 - 墨水滴 - bfs+优先队列 *
  18. 无线蓝牙耳机手机端app开发_汪峰耗时1500天造了一款耳机,秒杀苹果AirPods!
  19. CHARINDEX函数
  20. RESTful介绍和使用教程

热门文章

  1. android高级编程实操期末机试试题,《网络高级编程》201001机考试题A
  2. ustc linux 网络通,USTC 网络通脚本
  3. for循环中取出最大最小 累加_从零开始学Python - 第006课:循环结构
  4. html特效指令,vue2——指令v-text v-html v-bind
  5. html 星空效果,使用css实现星空效果!
  6. python基础教程--代码集合(下)
  7. mysql5717开发设置怎么调回来_华为手机这几个默认设置,一定要关闭,再也不卡顿...
  8. ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7 times
  9. T1串口波特率的计算方法
  10. VC中数字与字符串转换方法