所以我试图计算某个事物(例如," X")在不使用for循环的情况下出现在列表中的次数。所以我尝试了两件事:
ex: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 但是我也得到了一个我不明白的错误......它说的是“列表”#39;对象不可调用。这是什么意思?
我真的不想要一种更简单的方法来解决这个问题我只是想知道为什么我尝试过的两种方法都不起作用以及如何修复它们。
提前致谢!
〜编辑:并且不导入任何内容〜
答案 0 :(得分:2)
在你的第一个程序中,问问自己当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
答案 1 :(得分:1)
基本上,您需要确保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
。
答案 2 :(得分:1)
第二种方法,将final UserService userService = new UserService();
//...read from cmd
UserService.UserDetails details = userService.checkCredentials(username, password);
if (details == null) {
System.out.println("ACCESS DENIED");
} else {
System.out.println("WELCOME");
}
更改为b(pos)
,使用b[pos]
获取列表项:
[]
答案 3 :(得分:1)
日冰。在第一种方法中,如果b [0] [0] ==“X”,则只在第一行b [0]上递归。您需要在没有第一列(如您所做)的第一行以及其他行(即b [1:])上递归,或者删除b [0] [0],如.... [/ p>
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)无效,您将收到错误 - 该函数调用语法应用于列表。我建议使用2维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