繁体   English   中英

列表递归中的Python3列表

[英]Python3 Lists in Lists 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(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是一个列表并且它的第一个元素是“ 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

基本上,您需要在迭代b或尝试使用b[0]b[1:]访问其元素之前确保b是一个列表。

为第一种方法尝试以下方法:

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.Iterablelist

第二种方法,将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
>>> 

日冰。 在第一种方法中,如果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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM