Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查支架是否正确配对_Python - Fatal编程技术网

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