Python - 递归:重复int,在列表中重复int,在嵌套列表中重复int

时间:2016-10-29 04:07:58

标签: python algorithm recursion

我正在学习递归,但我无法弄清楚为什么这不起作用。

它应该做什么:

>>> copy(1)
[1, 1]
>>> copy([1, 2])
[1, 1, 2, 2]
>>> copy([1, [2, 3]]) 
[1, 1, [2, 2, 3, 3]]

所以基本上代码应该只复制每个整数。注意:列表中的位置和格式(如果它是嵌套列表)不会更改,所有这些代码都会在列表中的每个int旁边插入一个重复的int。

代码:

def copy(nested_list):
    new_list = []

    #if list is empty
    if isinstance(nested_list, list) and len(nested_list) == 0:
        return new_list

    # if it's only an int
    elif isinstance(nested_list, int):
        new_list.append(nested_list)
        new_list.append(nested_list)

    else:
        # if list is a list
        if isinstance(nested_list, list):
            for num in range(len(nested_list)):
                if isinstance(nested_list[num], int):
                    new_list.append(nested_list[num])
                    new_list.append(nested_list[num])
                elif isinstance(nested_list[num], list):
                    copy(nested_list[num])
                else:
                    pass

    return new_list

它适用于大多数示例,除了最后一个示例。

它为最后一个例子提供了什么:

Expected:
    [1, 1, [2, 2, 3, 3]]
Got:
    [1, 1]

4 个答案:

答案 0 :(得分:4)

检查一下!

def copy(nested_list):
    new_list = []

    #if list is empty
    if isinstance(nested_list, list) and len(nested_list) == 0:
        return new_list

    # if it's only an int
    elif isinstance(nested_list, int):
            new_list.append(nested_list)
            new_list.append(nested_list)

    else:
        # if list is a list
        if isinstance(nested_list, list):
            for num in range(len(nested_list)):
                if isinstance(nested_list[num], int):
                    new_list.append(nested_list[num])
                    new_list.append(nested_list[num])
                elif isinstance(nested_list[num], list):
                    tempList = copy(nested_list[num])
                    new_list.append(tempList)
                else:
                    pass

    return new_list

print(copy([1, [2, 3]]))

答案 1 :(得分:1)

您的copy函数是递归的,但您完全忽略递归调用copy的结果:

elif isinstance(nested_list[num], list):
    copy(nested_list[num])
    ^^^^^^^^^^^^^^^^^^^^^^

您可能希望将来自copy的通话所返回的商品附加到new_list的末尾:

new_list.append(copy(nested_list[num]))

你也可以稍微简化一下:

def copy(nested_list):
    if isinstance(nested_list, int):
        return copy([nested_list])

    result = []

    for elem in nested_list:
        if isinstance(elem, int):
            result.append(elem)
            result.append(elem)
        else:
            result.append(copy(elem))

    return result

答案 2 :(得分:1)

这是另一种实施方式!

def copy(items):
    if isinstance(items, int):
        return [items, items]

    result = []
    for element in items:
        if isinstance(element, int):
            result.extend(copy(element))
        else:
            result.append(copy(element))
    return result

答案 3 :(得分:0)

递归的技巧是解决最基本的情况并调用自身来解决(现在)较小的问题:

def repeat_int(seq_or_int, nested=False):
    try:
        first, *rest = seq_or_int
    except TypeError:  # got int
        return [seq_or_int] * 2  # repeat int
    except ValueError:  # empty
        result = []
    else:
        result = repeat_int(first, nested=True) + repeat_int(rest)
    return [result] if nested else result  # nest in a list if necessary

示例:

>>> repeat_int(1)
[1, 1]
>>> repeat_int([1, 2])
[1, 1, 2, 2]
>>> repeat_int([1, [2, 3]])
[1, 1, [2, 2, 3, 3]]

这里有两个基本情况:

  • 输入不是可迭代的(标量,例如int) - 返回列表中的重复输入
  • 输入为空 - 返回一个空列表。

The Python 3 iterable unpacking syntax切断输入集合中的第一项:

first, *rest = seq_or_int

要获得集合其余部分的结果,使用(现在)较小的列表repeat_int(rest)进行递归调用。

剩下的就是处理第一个与输入相同的项目也可能是一个集合。要保留结构,将传递nested指示符,如果已设置,则结果列表将包含在另一个列表中。