[英]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.Iterable
为list
。
第二种方法,将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.