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
有人可以帮我吗?
答案 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
希望这能为您清除一切。