检查列表中是否存在字符

时间:2015-11-17 14:34:23

标签: python python-3.x recursion

我试图编写一个递归函数来检查列表中是否存在某个字符(列表中可以包含子列表)。

到目前为止,我已经提出了这个问题,但它似乎并没有起作用。 我做错了什么?

    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"未定义

2 个答案:

答案 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“未定义”。

这是因为它没有定义,假设这是您的完整代码。这同样适用于bcd

您需要事先用一些字符串对象定义这些变量(1.),或者将字母自己写成字符串文字(2.):

  1. a, b, c, d = "my_string1", "my_string2", "my_string3", "my_string4"
  2. print(exists('c', ['a', ['b', 'c'], 'd']))
  3. 除此之外,您将函数定义为def exists(str, seq):,但是将其调用为exists(seq[0]),这意味着您缺少参数。

    然后你试图添加布尔值,这可能有效,但我不确定它是否是你想要实现的:return exists(seq[0]) + exists(seq[1:])。如果转换为布尔值,2也将为True。但如果其中一个陈述是True,它也将是0。要检查是否两者都是True,您应该将这些值相乘。此外,尝试对每个返回案例使用相同的返回类型。

    您还使用了seq的第一个字符(或项目),而您实际上想要使用字符串str的第一个字符。小心! str是一个类型类,不要将它用作变量名。