Python 检查支架是否正确配对
我有很多括号,比如Python 检查支架是否正确配对,python,Python,我有很多括号,比如 li1 = ['{','[','(',')',']','}' ] # correctly paired li2 = ['[','(',')',']'] # correctly paired li3 = ['{','[','}',']',')','}'] # incorrectly paired 如何使用for循环比较第一个元素和最后一个元素,然后比较下一个元素和下一个最后一个元素 我的解决办法是 if len(li) %2 == 0: fo
li1 = ['{','[','(',')',']','}' ] # correctly paired
li2 = ['[','(',')',']'] # correctly paired
li3 = ['{','[','}',']',')','}'] # incorrectly paired
如何使用for循环比较第一个元素和最后一个元素,然后比较下一个元素和下一个最后一个元素
我的解决办法是
if len(li) %2 == 0:
for i in range(len(li)):
if li[0] == li[-1]: #and if li[1] == li[-2]: and so on.....
return True
else:
return False
else:
return False
但是这会为li3返回错误的结果。您的代码中有3处错误: 您总是在第一次检查时返回;您需要推迟判断,直到您测试了所有对。 您没有使用i计数器,因此您的循环只测试第一个和最后一个元素 您需要将左括号映射到右括号;'['=']'永远不会为真,但配对是正确的。 我不会费心使用计数器,从开始到结束使用和配对元素;您只需测试li的前半部分: 演示: 然而,测试嵌套的单个维度通常是不够的。大多数实际情况都包含多个分组,如[,'{','}','[',']',]注意,{,}和[,]对不是嵌套的!。如果需要匹配这种情况,则需要使用堆栈:
def test_groupings(li, _map={'(': ')', '[': ']', '{': '}'}):
stack = []
for el in li:
if el in _map:
# opening element, add to stack to look for matching close
stack.append(el)
elif not stack or _map[stack[-1]] != el:
# not an opening element; is the stack is empty?
# or is this element not paired with the stack top?
return False
else:
# closing element matched, remove opening element from stack
stack.pop()
# if the stack is now empty, everything was matched
return not stack
这仍然可以正确地检测您的案例,*但对于我的反例,也会返回True:
>>> test_groupings(['{', '[', '(', ')', ']', '}'])
True
>>> test_groupings(['[', '(', ')', ']'])
True
>>> test_groupings(['{', '[', '(', ']', ')', '}'])
False
>>> test_groupings(['(', '{', '}', '[', ']', ')'])
True
你的错误是: 使用索引0和-1代替i。 比较开括号和关括号 因此,以下是我的解决方案:
def check(li):
length = len(li)
if length % 2 == 0:
pairs = {'}': '{', ']': '[', ')': '('}
stack = []
for i in range(length):
if li[i] in pairs.values():
stack.append(li[i])
elif li[i] in pairs.keys() and stack[-1] == pairs[li[i]]:
stack.pop()
return len(stack) == 0
else:
return False
我使用堆栈作为开始括号,如果它找到结束括号,它将弹出堆栈。最后,检查堆栈是否被清除
使用测试用例的测试结果
li1 = ['{','[','(',')',']','}' ]
check(li1)
>>> True
li2 = ['[','(',')',']']
check(li2)
>>> True
li3 = ['{','[','(',']',')','}']
check(li3)
>>> False
另外,你在这里已经有足够长的时间了,有超过500个未删除的问题,我希望你现在知道如何提出一个好问题。这还远远不够。另外,您的所有配对都是嵌套的,还是可以有多个组?像[,'{','}','[',']',]?这样一个例子是有效的还是无效的?有趣的是,你首先编写了一个修正版,应用了我已经写过的所有修复程序,然后完全改变了你的答案,使用了我在稍后编辑的答案中提倡的堆栈方法。请不要剽窃您的解决方案。除此之外,如果输入的结束括号多于开始索引器,则堆栈方法将失败。不要在ranglenit中使用for i:然后在您可以直接迭代it元素时使用it[i]。不要在dict.keys中使用某些内容当dict中的某些内容在没有额外调用的情况下工作正常,并且奇偶长度检查现在是半冗余的时,堆栈方法将检测相同的情况。即使它可能会为大型输入节省几毫秒的时间,您也希望通过尽早反转并返回False来清理测试,这样您就可以取消对其余部分的输入。@MartijnPieters嗨,谢谢您的建议。读了你的第四个测试用例后,我意识到我的第一次提交有缺陷。但是,让我澄清一下。堆栈方法之所以完成,是因为我记得我以前做过这个案例。所以,如果这看起来像瘟疫,我道歉。我吸取了教训。所以,再一次谢谢你你能解释一下else部分w,r,t输入测试分组['{','['',']','}']吗?我的问题是else部分如何匹配。你也可以将else部分转换为elif以供我使用吗understanding@Rajeev:else是剩余选项,所有其他可能性已包含在它之前的if和elif中。没有必要让它成为另一个elif,那只是口译员需要做更多的工作。如果测试输入的前三个元素的左括号是否为true,则elif会确保在到达第四个元素时堆栈不是空的,但事实并非如此,堆栈顶部是当前元素的左括号,因此,只有当堆栈上有一个匹配的左括号时,我们才能到达else。@Rajeev:换句话说,只有当这三个条件都为真时,才能到达else:元素不是左括号,我们以前见过左括号,因为堆栈上有元素,堆栈顶部是与此元素匹配的左括号,所以它是右括号。这意味着我们可以从堆栈中移除顶部,它已匹配。
def check(li):
length = len(li)
if length % 2 == 0:
pairs = {'}': '{', ']': '[', ')': '('}
stack = []
for i in range(length):
if li[i] in pairs.values():
stack.append(li[i])
elif li[i] in pairs.keys() and stack[-1] == pairs[li[i]]:
stack.pop()
return len(stack) == 0
else:
return False
li1 = ['{','[','(',')',']','}' ]
check(li1)
>>> True
li2 = ['[','(',')',']']
check(li2)
>>> True
li3 = ['{','[','(',']',')','}']
check(li3)
>>> False