在Python中合并两个排序的列表

排序过的列表是以升序或降序排列的,合并这些排序过的列表是指以这样的方式合并两个列表,使它们保持排序。

在 Python 中有多种方法可以合并两个排序的列表。Python 有内置的函数来执行这项任务,但我们也将讨论设计这些内置函数时使用的天真方法。

在Python中合并两个已排序的列表

在这篇文章中,我们得到了一个问题陈述,并要求我们设计一个解决方案。问题是,我们有两个单独排序的列表,但我们需要合并它们,使其在合并后保持排序。

让我们通过一个例子来理解这个问题。

list1 = [2,5,7,8,9]
list2 = [0,1,3,4,6]

输出:

Sorted List: [0,1,2,3,4,5,6,7,8,9]

输出中的排序列表是由列表list1list2 中的元素组成。在合并之后,它们的排列方式使得合并后的列表仍然是排序的。

这个问题与设计合并排序中使用的merge 函数相同。因此,我们在解决这些问题时经常会遇到这类问题。

因此,我们应该对如何处理它有一个基本概念。现在,让我们了解一下我们将如何解决这个问题。

在Python中合并两个已排序列表的天真方法

我们将讨论的解决方案是一种天真的方法,它将在Python中合并两个排序的列表。在这个方法中,我们同时遍历两个列表,并在当前位置检查两个元素之间的小元素。

较小的元素被附加到答案中。然而,如果两个列表中的一个被完全遍历了,另一个列表就会在合并元素后被追加到结果中。

让我们看看代码以更好地理解它。

firstList = [2, 7, 8, 9]
secondList = [0, 1, 4, 6]
result = []
i, j = 0,0
while i < len(firstList) and j < len(secondList):
    if firstList[i] < secondList[j]:
      result.append(firstList[i])
      i = i+1
    else:
      result.append(secondList[j])
      j = j+1
result = result + firstList[i:] + secondList[j:]
print ("Sorted List: " + str(result))

输出:

Sorted List: [0, 1, 2, 4, 6, 7, 8, 9]

我们在上面的代码中声明了一个空列表result ,它将存储我们的合并列表。然后我们遍历两个列表,直到其中一个或两个都被耗尽。

在循环过程中,我们比较两个列表中的元素,并将较小的元素追加到我们的result ,然后我们将当前的索引增加1。

如果两个列表中的任何一个有不包括在我们的结果中的元素,我们就使用Python中的切片操作符将剩余的元素合并到我们的答案中。

在这个方法中,我们只对列表进行了一次迭代;因此,它的时间复杂度为O(n1+n2) ,而上述方法的空间复杂度也是O(n1+n2) ,其中n1n2 是指排序列表的大小。

使用Python中的heapq.merge() 方法合并两个排序的列表

Python中的heapq 模块指的是Heap队列。然而,这个模块,Heapq ,主要用于实现Python中的优先级队列。

heapq 模块包含 Python 中的merge() 函数,该函数将多个排序的列表作为参数,并返回一个组合的、合并的列表。

让我们看看如何使用 Python 中的heapq.merge() 函数进行合并操作。

from heapq import merge
first = [2, 7, 8, 9]
second = [0, 1, 4, 6]
res = list(merge(first, second))
print("Merged Sorted list: ", str(res))

输出:

Merged Sorted List: [0, 1, 2, 4, 6, 7, 8, 9]

在上面的代码中,我们在merge() 函数中把两个排序的列表firstsecond 作为参数传递,之后我们把它们明确地转换成一个列表。结果,合并后的排序列表将被存储在ans 变量中。

正如我们所看到的,我们可以使用heapq 模块的merge() 函数,在 Python 中合并两个排序的列表。

在 Python 中使用sorted() 函数合并两个已排序的列表

Python 的sorted() 函数对作为参数提供的列表或图元进行排序。它总是返回一个将被排序的列表,而不改变原始序列。

我们可以使用这个函数只用一行来解决我们的问题。我们将两个列表附加在一起,然后对结果列表应用sorted() 函数。

让我们通过一个例子来理解它。

first = [2, 7, 9]
second = [0, 1, 4]
result = sorted(first+second)
print("List after sorting: ", str(result))

输出:

List after sorting: [0, 1, 2, 4, 7, 9]

在上面的程序中,我们使用了+ 操作符将两个列表追加到一起。连接运算符+ ,用于将多个列表按照输入代码的顺序附加到一个合并的列表中。

之后,我们对附加的列表应用了sorted() 函数,对序列进行排序并打印出结果。

这种方法可能需要更多的时间,因为在内部,我们是将两个列表追加到一个列表中,这将比上面讨论的其他两种方法花费更多的时间。

总结

这篇文章讨论了我们在 Python 中合并两个排序的列表的不同方法。其中两个是 Python 中内置的方法,而另一个则是解决这个问题的详细方法。

sorted() 函数是用于对附加列表进行排序的内置函数之一,而另一个heapq.merge() 是用于在 Python 中合并两个排序列表的方法。这两个函数都可以在单行中进行操作。

详细的方法是在列表中进行迭代,在当前索引处比较每个元素,将较小的元素追加到答案中,然后将当前索引增加1。这个循环一直运行到任一或两个列表被耗尽,之后通过Python的切片操作符追加剩余的元素。

你可以使用上面讨论的任何一种方法来解决这个问题。