简体   繁体   English

如何定义递归 function 以合并两个排序列表并返回 Python 中递增顺序的新列表?

[英]How to define a recursive function to merge two sorted lists and return a new list with a increasing order in Python?

I want to define a recursive function to merge two sorted lists (these two lists are sorted) and return a new list containing all the values in both argument lists with a increasing order.我想定义一个递归 function 来合并两个排序列表(这两个列表已排序)并返回一个新列表,其中包含两个参数列表中的所有值,并按递增顺序排列。 I know I can use list.extend() and sorted() to get that,but I don't want to use them.我知道我可以使用 list.extend() 和 sorted() 来获得它,但我不想使用它们。 I just want to do some exercise about the recursion.我只想对递归做一些练习。

For example:例如:

if a = [1,2,3,4], b = [5,6,7,8]

print(function(a,b))

[1,2,3,4,5,6,7,8]

This is my code:这是我的代码:

def combine(a:list, b:list):    
    alist = []
    if a == [] and b == []:
       return alist
    if a != [] and b == []:
       return alist + a
    if a == [] and b != []:
       return alist + b     
    if a != [] and b != []:
       if a[0] <= b[0]:
          alist.append(a[0])
          return combine(a[1:], b)
       if a[0] > b[0]:
          alist.append(b[0])
          return combine(a, b[1:])
    return alist

I always get [5,6,7,8].我总是得到 [5,6,7,8]。 How should I do to get [1,2,3,4,5,6,7,8]?我该怎么做才能得到 [1,2,3,4,5,6,7,8]?

Instead of return, you should add it to the alist as like below. 除了返回以外,您应该将其添加到列表中,如下所示。

def combine(a, b):
    alist = []
    if a == [] and b == []:
       return alist
    if a != [] and b == []:
       return alist + a
    if a == [] and b != []:
       return alist + b
    if a != [] and b != []:
       if a[0] <= b[0]:
          alist.append(a[0])
          alist = alist +  combine(a[1:], b)
       if a[0] > b[0]:
          alist.append(b[0])
          alist = alist +  combine(a, b[1:])
    return alist

Just a simpler version: 只是一个简单的版本:

def combine(a, b):
    if a and b:
        if a[0] > b[0]:
            a, b = b, a
        return [a[0]] + combine(a[1:], b)
    return a + b

Test: 测试:

>>> combine([1,3,6,8], [2,4,5,7])
[1, 2, 3, 4, 5, 6, 7, 8]
def combine(a,b):
    if not a and not b: return []
    if not a: return [b[0]] + combine(a, b[1:])
    if not b: return [a[0]] + combine(a[1:], b)
    if a[0] > b[0]:
        return [b[0]] + combine(a, b[1:])
    return [a[0]] + combine(a[1:], b)

Your test case: 您的测试案例:

In [2]: a = [1,2,3,4]

In [3]: b = [5,6,7,8]

In [4]: combine(a,b)
Out[4]: [1, 2, 3, 4, 5, 6, 7, 8]

Another test case: 另一个测试用例:

In [24]: a
Out[24]: [1, 2, 3, 8, 9]

In [25]: b
Out[25]: [1, 3, 5, 6, 7]

In [26]: combine(a,b)
Out[26]: [1, 1, 2, 3, 3, 5, 6, 7, 8, 9]

Here are some alternatives : 以下是一些替代方案

The smarter way to do this is to use merge function from the heapq module: 这样做的更聪明的方法是使用heapq模块中的merge函数:

from heapq import merge
list(merge(a,b))

Test: 测试:

>>> a = [1,2,3,4,7,9]
>>> b = [5,6,7,8,12]
>>> [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 12]

And without using recursion: 并且不使用递归:

def combine(a:list, b:list):    
    alist = []
    i,j = 0,0
    while i < len(a) and j < len(b):
        if a[i] < b[j]:
            alist.append(a[i])
            i+=1
        else:
            alist.append(b[j])
            j+=1

    while i < len(a):
        alist.append(a[i])
        i+=1

    while j < len(b):
        alist.append(b[j])
        j+=1

    return alist

Test: 测试:

>>> a = [1,2,3,4,7,9]
>>> b = [5,6,7,8,12]
>>> [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 12]

Inspired by Stefan Pochmann answer:灵感来自 Stefan Pochmann 的回答:

def combine(a, b):
    if not a or not b:
        return a or b
    if a[0] >= b[0]:
        return [b[0]] + combine(a, b[1:])
    return [a[0]] + combine(a[1:], b)

Example:例子:

print(combine([1, 2, 3], [4, 5, 6]))
# [1, 2, 2, 3, 5, 6]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM