【问题标题】:Python3 Lists in Lists recursion列表递归中的 Python3 列表
【发布时间】:2017-06-24 05:43:46
【问题描述】:

所以我试图在不使用 for 循环的情况下计算某个事物(例如,“X”)在列表中出现的次数。所以我尝试了两件事:

例如:b = [["X",2,4],[2,3,1],["X","X",1]] 和 countX 应该返回 => 3

我第一次尝试这个:

def countX(b):
    if b == []:
        return 0
    elif b[0] == []:
        return countX(b[1:])
    elif b[0][0] == "X":
        return countX(b[0][1:]) + 1
    else:
        return countX(b[0][1:])

但我认为我错过了一个案例?如果有人知道这里出了什么问题,请解释:)

我尝试使用 count 的第二种方法是这样的:

def countX(b, posn):
    if posn == len(b):
        return 0
    else:
        return countX(b, pos+1) + b(pos).count("X")

对于这种方法,我会在 posn 中输入 0 但我也遇到了一个我不明白的错误......它说“列表”对象不可调用。这是什么意思?

我真的不想要一个更简单的方法来解决这个问题我只是想知道为什么我尝试过的两种方法都不起作用以及如何解决它们。

提前致谢!

~edit: 并且不导入任何东西~

【问题讨论】:

  • b(pos) 这应该是b[pos]

标签: python list python-3.x recursion


【解决方案1】:

嗨嗨。在第一种方法中,如果 b[0][0] == "X",那么您只会在第一行 b[0] 上递归。您需要在没有第一列的第一行(如您所做的那样)加上其他行(即 b[1:]),或删除 b[0][0],如 ....

def count_X(b, r, c):
    if r == len(b):
        return 0
    if c == len(b[r]):
        return count_X(b, r+1, 0)

    count = count_X(b, r, c+1)
    if b[r][c] == "X":
        count += 1

return count

在第二种方法中,如果有 X,则永远不会添加 1。您会收到错误,因为 b(pos) 无效 - 这是应用于列表的函数调用语法。我建议使用二维 pos 来跟踪您在行和列方面的位置...

def count_X(b, r, c):
    if r == len(b):
        return 0
    if c == len(b[r]):
        return count_X(b, r+1, 0)

    count = count_X(b, r, c+1)
    if b[r][c] == "X":
        count += 1

return count

【讨论】:

    【解决方案2】:

    基本上,您需要确保b 是一个列表,然后再遍历它或尝试使用b[0]b[1:] 访问它的元素。

    尝试第一种方法:

    import collections
    
    def count_X(b):
        if b == "X":
            return 1
        if isinstance(b, collections.Iterable):
            return sum(count_X(elem) for elem in b)
        else:
            return 0
    

    如果您确定只处理列表,可以将collections.Iterable 替换为list

    【讨论】:

    • 感谢您的解决方案!但我正在尝试找出一种不需要任何导入的方法
    • 正如我所说,您可以使用简单的list 代替您的情况。 import collections 只是为了让它更通用。
    • 哦,我明白了我不是 100% 你的意思,因为我不知道集合是做什么的。我试试你的方法!感谢您提供替代方案。
    • collections.Iterable 基本上是一个泛型类,其中包含所有可迭代的容器对象,如列表、元组、字典、集合等......这一行基本上只是检查 b 是否是一个列表。您也可以使用if type(b) == list 来执行此操作。
    【解决方案3】:

    在你的第一个程序中,问问自己当 b 是一个列表并且它的第一个元素是“X”时会发生什么。 (提示:这将是一个 IndexError)

    其他答案避免了显式循环,但仍然在幕后使用它们。所以,如果你真的下定决心要避免任何循环......

    def func(li):
        ans=0
        if type(li) is list and len(li):
            ans+=func(li[0])
            ans+=func(li[1:])
        elif li=='X':
            return 1
        return ans
    

    运行时:

    >>> b=[[23,'X',['X','jh',['as','X']],['X']],'X','S']
    >>> func(b)
    5
    

    【讨论】:

      【解决方案4】:

      第二种方法,将b(pos)改为b[pos],使用[]获取列表项:

      >>> b = [["X",2,4],[2,3,1],["X","X",1]] 
      >>> def count_X(b, pos):
      ...     if pos == len(b):
      ...         return 0
      ...     else:
      ...         return count_X(b, pos+1) + b[pos].count('X')
      ... 
      >>> count_X(b,0)
      3
      >>> 
      

      【讨论】:

      • 哦,好的,这确实解决了第二种方法并且很有意义!谢谢:)
      猜你喜欢
      • 2016-02-06
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多