列表递归中的Python3列表

列表递归中的Python3列表,python,list,python-3.x,recursion,Python,List,Python 3.x,Recursion,所以我试着数一数某件事有多少次,例如,X在一个列表中出现而没有使用for循环。所以我尝试了两件事: 例如: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(

所以我试着数一数某件事有多少次,例如,X在一个列表中出现而没有使用for循环。所以我尝试了两件事:

例如: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:])
但我想我错过了一个案子?如果有人知道这里出了什么问题,请解释:

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

def countX(b, posn):
    if posn == len(b):
        return 0
    else:
        return countX(b, pos+1) + b(pos).count("X")
对于此方法,我将在posn中输入0 但我也犯了一个我不明白的错误。。。它表示“list”对象不可调用。这是什么意思

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

提前谢谢


~edit:在不导入任何内容的情况下~

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

请尝试以下第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。

第二种方法,将bpos更改为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
>>> 

在你的第一个程序中,问问自己当b是一个列表,它的第一个元素是“X”时会发生什么。提示:它将是一个索引器

其他答案避免显式循环,但仍在幕后使用。所以,如果你真的决心避免任何循环

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

你好。在第一种方法中,如果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。出现错误是因为bpos无效-这是应用于列表的函数调用语法。我建议使用二维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

谢谢你的解决方案!但我正试图找出一种不需要任何导入的方法,正如我所说的,您可以使用简单列表来代替您的案例。导入集合只是为了让它更通用。哦,我明白了,我不是100%理解你的意思,因为我不知道集合做了什么。我来试试你的方法!感谢您提供的另一种选择。collections.Iterable基本上是一个泛型类,包含所有Iterable容器对象,如列表、元组、dict、集合等。。。这一行基本上只是检查b是否是一个列表。如果typeb==list,也可以这样做。哦,好吧,这确实修复了第二个方法,而且很有意义!谢谢:bpos这应该是b[pos]