【问题标题】:Recursively going through a list (python)递归遍历列表(python)
【发布时间】:2014-03-01 01:24:50
【问题描述】:

假设我有一个列表 x = [1, 2, 3, 4]

有没有一种递归方法可以让我通过列表找到值?

我希望最终能够将列表(或嵌套列表)中的返回值与任意数字进行比较以查看它是否匹配。

我可以想办法使用 for 循环来做到这一点,但我很难想象用递归方法来做同样的事情。我知道我不能设置一个计数器来跟踪我在列表中的位置,因为递归调用函数只会每次都重置计数器。

我想我可以将函数的基本情况设置为数字和 len 1 列表之间的比较。

我真的只是想要一些提示。

【问题讨论】:

  • num in x?这有什么问题?
  • (您也可以将计数器与列表一起传递)

标签: python list recursion nested-lists


【解决方案1】:

不是在 Python 中做事的方式,但可以肯定 - 您可以递归地遍历列表:

def findList(lst, ele):
    if not lst:         # base case: the list is empty
        return False
    elif lst[0] == ele: # check if current element is the one we're looking
        return True
    elif not isinstance(lst[0], list): # if current element is not a list
        return findList(lst[1:], ele)
    else:                              # if current element is a list
        return findList(lst[0], ele) or findList(lst[1:], ele)

【讨论】:

  • 它有效 - 可以看到递归可以让我每次都将列表的“顶部”切片:我正在尝试将它应用于嵌套列表但它不起作用 - 我添加了一个 elif 语句如果列表中的元素之一被发现为类型列表,则调用子列表上的函数。并且该功能不适用于更深的列表。
【解决方案2】:

当你有一个链表时,递归函数是惯用的。 Python 列表更像数组。但是仍然可以使用递归函数处理 Python 列表——没有真正的实用程序,但作为练习可能会很有趣。

你从一个完整的列表开始,你的基本情况是当列表为空时。通过将列表作为参数传入来遍历列表,使用x.pop() 同时获取和删除列表中的第一项,评估弹出的项,然后将列表(现在更短)传递给同一个函数。

编辑:实际上,再想一想,最好不要使用 x.pop() 而是查看第一个值并将其余部分传递给切片。这将非常低效,因为您每次切片时都在复制列表,但它比在递归函数中破坏性地消耗列表要好,除非这是期望的副作用。

【讨论】:

    【解决方案3】:

    那么你将有两个基本情况:

    1) 您已到达列表末尾 => 返回 false。

    2) 您当前的元素是您正在寻找的元素 => 返回 true (或元素或其位置,无论您感兴趣)。

    您必须始终检查当前元素的两个基本情况,如果没有一个基本情况应用,则递归地将该函数应用于列表中的下一个元素。

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 2016-04-30
      • 2021-10-11
      • 2021-10-05
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多