Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在线性时间内合并python中的两个排序列表(仅遍历一次)?_Python_Python 2.7 - Fatal编程技术网

如何在线性时间内合并python中的两个排序列表(仅遍历一次)?

如何在线性时间内合并python中的两个排序列表(仅遍历一次)?,python,python-2.7,Python,Python 2.7,预期产出: list_a = [1,7,9,35,36,37] list_b = [3,4,5,40] 条件:只能遍历两个列表一次 我知道zip,如下所示,非常符合我的要求 list_merged = [1,3,4,5,7,9,35,36,37,40] 您可以使用不同的索引变量遍历这两个列表 >>> x = [1, 2] >>> y = [1, 3, 4, 5, 6] >>> zip(x,y) [(1, 1), (2, 3)] >&

预期产出:

list_a = [1,7,9,35,36,37]
list_b = [3,4,5,40]
条件:只能遍历两个列表一次 我知道
zip
,如下所示,非常符合我的要求

list_merged = [1,3,4,5,7,9,35,36,37,40]

您可以使用不同的索引变量遍历这两个列表

>>> x = [1, 2]
>>> y = [1, 3, 4, 5, 6]
>>> zip(x,y)
[(1, 1), (2, 3)]
>>> zip(y, x)
[(1, 1), (3, 2)]
list_a=[1,7,9,35,36,37]
列表b=[3,4,5,40]
指数a=0
索引_b=0
合并=[]

而指数a是我自己尝试的。解决方案不是很短,而是简单的

list_a = [1,7,9,35,36,37]
list_b = [3,4,5,40]
index_a = 0
index_b = 0
merged = []
while index_a<len(list_b) or index_b < len(list_b):
    if index_a<len(list_a) and list_a[index_a]<=list_b[index_b]:
        merged.append(list_a[index_a])
        index_a +=1
    elif index_b<len(list_b):
        merged.append(list_b[index_b])
        index_b +=1
print merged
# [1, 3, 4, 5, 7, 9, 35, 36, 37, 40]
def线性合并(列表1、列表2):
i=0
j=0
列表m=[]结果列表
而i
为每个列表保留两个指针(用于列表的索引),并检查较小的元素。当找到较小的元素时,将指针移动到该列表的下一个元素。保持另一个(第二个列表)指针不变。因此,每个列表只能遍历一次。如果您实现了上述方法,您唯一错过的就是最大(最后)元素。因此,又使用了一个指针来保留最后一个元素

希望这有助于:

def linear_merge(list1, list2):
  i = 0
  j = 0
  list_m = [] # resultant list

  while i < len(list1) and j < len(list2):
    if list1[i] <= list2[j]: #take element from list 1 
      list_m.append(list1[i])
      i += 1
    else: # or take element from list 2
      list_m.append(list2[j])
      j += 1

  if i <= len(list1) - 1: #append remaing elements from list 1 
    list_m.extend(list1[i:])
  elif j <= len(list2) - 1: #or append remaing elements from list 2
    list_m.extend(list2[j:])

  return list_m
list_a=[1,7,9,35,36,37]#也适用于list_a=[1,7,9,35,36,45]
列表b=[3,4,5,40]
ptr_a=0#a的指针
ptr_b=0#b的指针
last=0#最后一个元素的指针
list_merged=[]合并结果列表

而ptr_a合并两个列表的最简单方法是对这两个列表使用“+”运算符


这更像是一种python方法,而不是算法方法。 如果你想要一个更加算法化的方法。。。。 使用以下代码:-

list1 = [1,2,3]
list2 = [4,5,6]

list3 = list1+list2 

#This merges both lists and puts them in list3
现在list3将得到合并结果


无论如何,我应该警告你,第一种python方法几乎比第二种方法快3倍。(刚刚用timeit模块测试过)

不,您不需要这里的
zip
。你尝试过什么?我只能找到zip示例,但这在这里似乎不起作用。与其搜索一些示例,不如先想想如何解决这个问题。你将如何按顺序合并这两个列表?理想情况下,我将按每个列表,只从任何一个列表中前进计数器,继续将这个poped元素添加到第三个合并的列表中。继续,直到列表中的任何一个被用尽,并将所有剩余的其他列表附加到合并的列表中。@naren这正是正确的方法。试着去实现它吧!如果
list\u a
list\u b
短,例如
list\u a=[1,7,9]
,则此操作失败(无限循环)。最好检查两个索引是否都小于长度,然后使用循环后剩余的内容进行扩展。
list1 = [1,2,3]
list2 = [4,5,6]

list3 = list1+list2 

#This merges both lists and puts them in list3
list3 = [ ]
for i in list1:
   list3.append(i);
for i in list2:
   list3.append(i) ;