Python的范围超出了')'字符

时间:2018-02-02 22:26:56

标签: python

所以我应该解决一个算法问题,如果你有" {}"或"()"或" []"字符串有效 - 如果相关的括号打开并且彼此相邻,它们是有效的,您可以继续解析字符串。

这是我的代码:

def isValid(self, s):
    if len(s) <= 1:
        return False
    compare = ""
    for i, element in enumerate(s):
        compare = ""
        compare += (element)
        if compare == "(":
            if s[i + 1] == ")":
                continue
            else:
                return False
        if compare == '{':
            if s[i + 1] == '}':
                continue
            else:
                return False
        if compare == '[':
            if s[i + 1] == ']':
                continue
            else:
                return False
    return True

围绕计算&#34;)&#34;也就是第一个if语句,它超出了范围。

抛出错误:运行时错误消息:

Line 14: IndexError: string index out of range
Last executed input:
"){"

我用#34;){{])&#34;等字符串对此进行了测试。并且它正确返回false。但是,它会在&#34;){&#34;

上出错

为什么会这样?

更新:忘记索引。我无法理解为什么。当我们检查时,索引值应该是i,它仍然是索引0 ...我只是没有得到它。所以我重写了代码并使用了堆栈:

def isValid(self, s):
    stack = []
    dict = {"]":"[", "}":"{", ")":"("}
    for char in s:
        if char in dict.values():
            stack.append(char)
        elif char in dict.keys():
            if stack == [] or dict[char] != stack.pop():
                return False
        else:
            return False
    return stack == []

2 个答案:

答案 0 :(得分:1)

此处is的索引:

for i, element in enumerate(s):

但稍后您尝试在i+1处编制索引:

        if s[i + 1] 

如果is的最后一个索引,并且您将s的一侧编入索引,则会失败。

答案 1 :(得分:1)

  

我用一个字符串测试了这个,例如“){{])”,它返回false   正确。但是,它会在“){”

上出错      

为什么会这样?

让我们分解您的代码:

1。)s = "){"s有2个元素,即:

element: ) {
index:   0 1

2。)当你enumerate(s)时,迭代运行两次:

3。)第一次迭代,i == 0,您正在测试s[0] == ")" 4.)您的代码没有条件直接在迭代下检查s[0] == ")",因此没有任何反应。

5.。)第二次迭代,i == 1,您正在对s[1] == "{"进行测试 6.)您的代码具有检查if compare == '{':的条件(s[1] == "{")。 if条件现已激活。现在您的代码尝试执行以下操作:

 if s[i + 1] == '}':

7。)你正处于第二次(也是最后一次)迭代。 if语句尝试让s[i + 1]来测试条件。但s[1 + 1] s[2]。{。} 8.)回想你's'中的元素和索引:

element: ) { 
index:   0 1 
             ^ 
             doesn't exist

9。)s[2]不存在。 Python翻转并大吼大叫请求索引超出范围。

  

忘记索引。我只是不明白为什么。

不要。你永远会犯同样的错误。

学习,理解并克服它。这是改善的唯一方法。