我试图编写一个递归函数来检查列表中是否存在某个字符(列表中可以包含子列表)。
到目前为止,我已经提出了这个问题,但它似乎并没有起作用。 我做错了什么?
def exists(str, seq):
if not seq:
return 0
elif isinstance(seq[0], list):
return exists(seq[0]) + exists(seq[1:])
elif str == seq[0]:
return True
else:
return exists(seq[1:])
如果我尝试
print(exists("c", [a,[b,c],d]))
我得到了名字" a"未定义
答案 0 :(得分:1)
def exists(str, seq):
您不应使用内置类型str
作为变量的名称。
return 0
对于二进制函数,您应该返回False
,而不是0。
return exists(seq[0]) + exists(seq[1:])
对exist
的调用必须有两个参数,而不是一个。您应该使用or
,而不是+
。
return exists(seq[1:])
对exist
的调用必须有两个参数,而不是一个。
print(exists("c", [a,[b,c],d]))
[a,[b,c],d]
表示"包含名为a,b,c和d"的变量的嵌套列表。如果您没有带有这些名称的变量,则会因NameError而崩溃。也许你打算使用字符串文字。
def exists(s, seq):
if not seq:
return False
elif isinstance(seq[0], list):
return exists(s, seq[0]) or exists(s, seq[1:])
elif s == seq[0]:
return True
else:
return exists(s, seq[1:])
print(exists("c", ["a",["b","c"],"d"]))
答案 1 :(得分:1)
“我得到名字”a“未定义”。
这是因为它没有定义,假设这是您的完整代码。这同样适用于b
,c
和d
。
您需要事先用一些字符串对象定义这些变量(1.),或者将字母自己写成字符串文字(2.):
a, b, c, d = "my_string1", "my_string2", "my_string3", "my_string4"
print(exists('c', ['a', ['b', 'c'], 'd']))
除此之外,您将函数定义为def exists(str, seq):
,但是将其调用为exists(seq[0])
,这意味着您缺少参数。
然后你试图添加布尔值,这可能有效,但我不确定它是否是你想要实现的:return exists(seq[0]) + exists(seq[1:])
。如果转换为布尔值,2
也将为True
。但如果其中一个陈述是True
,它也将是0
。要检查是否两者都是True
,您应该将这些值相乘。此外,尝试对每个返回案例使用相同的返回类型。
您还使用了seq的第一个字符(或项目),而您实际上想要使用字符串str
的第一个字符。小心! str
是一个类型类,不要将它用作变量名。