括号匹配-查找带有输入括号索引的右括号-ValueError

时间:2020-02-19 19:22:24

标签: python

在这里

newb寻求有关我的括号代码的帮助。我想找到右方括号的索引 从给定起始索引的开/关括号字符串中

def matching_bracket(string, idx):
    string = list(string)
    a = {
        "(": ")",
        "[": "]",
        "{": "}",
        "<": ">"
    }
    close_bracket = a[string[idx]]
    if idx != ''.join(string).rindex(string[idx]):      #if open bracket is first bracket
        b = ''.join(string).rindex(string[idx])         #rightmost open bracket
        c = string[b:].index(close_bracket)             #next closest close bracket
        string[b], string[b+c:] = ".", "."              #replace both
        string = matching_bracket(''.join(string), idx)  # recurse
    else:
        d = string[idx:].index(close_bracket)
        return(idx + d)

matching_bracket("(([()]))",0)          #this fails, get error "ValueError: ')' is not in list"

matching_bracket('({})', 0) == 3             #yet these few output a correct val???
matching_bracket('([])', 1) == 2
matching_bracket('()()', 2) == 3

有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

这是一种奇怪的方式(我通常会用堆栈来做类似的事情)。但是我可以看到一些问题,包括导致值错误的问题。

第一个是string[b+c:]替换了索引b+c以后的所有内容,您确实想要string[b+c]。因此,在第一次运行时,"(([()]))"变为"(([..",这不是您想要的。

第二个是您没有返回递归步骤返回的值。我在这里更新了。

def matching_bracket(string, idx):
    a = {
        "(": ")",
        "[": "]",
        "{": "}",
        "<": ">"
    }
    close_bracket = a[string[idx]]

    if idx != string.rindex(string[idx]):      #if open bracket is first bracket
        b = string.rindex(string[idx])         #rightmost open bracket
        c = string[b:].index(close_bracket)             #next closest close bracket
        str_list = list(string)
        str_list[b], str_list[b+c] = ".", "."              #replace both
        return matching_bracket(''.join(str_list), idx)  # recurse
    else:
        d = string[idx:].index(close_bracket)
        return idx + d

希望这能为您清除一切。