如何递归遍历列表

时间:2020-10-14 21:17:53

标签: python

x

我正在尝试找出如何遍历列表并寻找x(在这种情况下为1),并从xlst中删除[1,1,2,1,2]的所有实例,其中这种情况是[2,2]。它应该输出 $('div#test img').attr('id') ,但只给我一个空列表。在我试图弄清楚这一点时,必须以递归方式进行,以更好地理解递归。

4 个答案:

答案 0 :(得分:2)

首先,您的递归是无止境的,永远不会结束。处理递归函数时请小心。

def remove_allr(x, xlst):
   if xlst:
       if xlst[0] == x:
           return remove_allr(x, xlst[1:])
       return [xlst[0]] + remove_allr(x, xlst[1:])
   return []


input_list = [1, 1, 2, 1, 2]
print(remove_allr(1, input_list)) # [2, 2]

它给出了预期的输出。

答案 1 :(得分:1)

首先让我指出,如果您不了解可变参数的工作原理,那么使用可变的默认参数将很危险:

def remove_elem(xl, x, res=[]): # don't do this!

执行以下操作:

def remote_elem(x1, x, res=None):
    if res is None:
        res = []

附加可变的默认参数更改默认值。相反,如果默认值为None,请使用None,并创建初始可变对象。注意is在这里是适当的,因为None(以及TrueFalse)是单例。

为使递归正常工作,递归需要一个终止条件和一个递归定义。在这种情况下是:

  • 终止条件:一个空列表将返回一个空列表。
  • 递归定义:
    一种。如果第一个元素匹配,则返回递归调用,并减少列表中的第一个元素。
    b。如果第一个元素不匹配,则返回元素+递归调用,并减少列表中的第一个元素。

示例(请注意,不需要默认参数)

def remove_allr(x,xlst):
    # termination condition
    if not xlst:
         return []

    # recursion
    if xlst[0] == x:
        return remove_allr(x,xlst[1:])
    else:
        return xlst[:1] + remove_allr(x,xlst[1:])

print(remove_allr(2,[1,2,3,2,4]))

输出:

[1, 3, 4]

这是一个不太重复的紧凑版本:

def remove_allr(x,xlst):
    if not xlst:
        return []
    return ([] if xlst[0] == x else xlst[:1]) + remove_allr(x,xlst[1:])

答案 2 :(得分:0)

这可能不是学习递归的更好的任务,但这是:

def remove_elem(xl, x, res=[]):
    if xl[0] != x:
        res.append(xl[0])
    if len(xl) > 1:
        return remove_elem(xl[1:], x, res)
    else:
        return res


example_list = [1, 1, 2, 1, 1, 2]
final_result = remove_elem(example_list, 1)  # final_result is [2, 2]

我认为不是更好的示例,因为递归函数需要在递归过程中传递一个附加列表以存储最终结果。

每次递归时,如果满足条件,将评估列表的第一个元素并将其添加到结果列表中。然后,如果列表的长度大于1(即还有其他元素要被撤消),则该函数将递归调用列表的其余部分,直到对所有元素求值为止。
最后的else是递归中断的地方,并返回最终结果。

答案 3 :(得分:-1)

也许是吗?

def remove_allr(x, oldlist):
    newlist = []
    for n in oldlist:
        if n != 1: newlist.append(n)

    return newlist

remove_allr(1, [1,1,2,1,2])
# [2, 2]

递归

def remove_allr_rec(x, oldlist, newlist):
    if len(oldlist) == 0:
        return newlist

    last = oldlist.pop()

    if last != x:
        newlist.append(last)

    return remove_allr_rec(x, oldlist, newlist)

remove_allr_rec(1, [1, 1, 2, 1, 2], [])
# [2, 2]