如何仅使用递归通过python从列表中删除项目

时间:2019-05-20 10:18:23

标签: python recursion

如何仅通过使用不带循环的递归以及任何内置方法或函数来用python写代码?我尝试过:

def myRemove(x, cont): # x is a string inside of the list cont
    if x == cont:
        return None
    elif len(x) > len(cont):
        return None
    else:
        if "x" not in cont[0]:
            return myRemove(x,cont[1:])
        else:
            return cont

2 个答案:

答案 0 :(得分:2)

我在您的代码中看到了一些问题:

1。字符串和变量之间的区别

您的代码中的以下行在语义上是错误的:

if "x" not in cont[0]:
    ...

此处"x"是字符串'x',而不是x的值。要解决此问题,请删除引号。

if x not in cont[0]:
    ...

2。列表和变量之间的区别

要检查变量是否在列表中,请使用in。例如

>>> "test" in ["test", "wow", "u"]
true

要检查一个变量是否等于另一个变量,请使用==。例如

>>> "test" == ["test", "wow", "u"][0]
true

代码的固定部分:(因为cont[0]返回一个值而不是一个列表)

if x == cont[0]:
    ...

3。递归返回

您必须将返回的列表与列表部分并置在另一个列表之前。 否则,您将始终返回列表的最后一部分。

一种可能的解决方案

def remove(string, string_list):
    if string_list[0] == string:
        return string_list[1:]
    else:
        return string_list[:1] + remove(string_list[1:], string)

答案 1 :(得分:1)

def recursive_remove(x: str, cont: list):
    """ removes items equal to x using recursion only
        cont: list of strings
        x: string to remove from list
    """
    if len(cont) == 0:
        return []
    if cont[0] != x:
        return [cont[0]] + recursive_remove(x=x, cont=cont[1:])
    else:
        return recursive_remove(x=x, cont=cont[1:])


list_without_banana = recursive_remove(x='banana', cont=['apple', 'banana', 'strawberry', 'peanut'])
print(list_without_banana)
>>>['apple', 'strawberry', 'peanut']