比较python中的括号

时间:2015-03-20 04:43:26

标签: python python-2.7

from collections import Counter
x = '((()))'

print Counter(x)

Counter({')': 3, '(': 3})

我需要比较我的字符串的开括号和括号是否相等。我用反击来做这件事。但是我应该如何比较计数器变量的两个值?

3 个答案:

答案 0 :(得分:5)

您可以使用使用.count()的小功能:

>>> def checkparen(inp):
...     return inp.count('(') == inp.count(')') and inp.count('[') == inp.count(']') and inp.count('{') == inp.count('}')
... 

因此:

>>> checkparen('((()))')
True
>>> checkparen('((())')
False
>>> checkparen('[ [ { { ( ( ) ) } } ] ]')
True
>>> 

或者,使用collections.Counter

>>> def checkparen(inp):
...     counter = collections.Counter(inp)
...     symbols = {'{':'}','[':']','(':')'}
...     for symbol in symbols:
...             if counter[symbol] != counter[symbols[symbol]]:
...                     return False
...     return True
... 
>>> checkparen('{')
False
>>> checkparen('[ [ { { ( ( ) ) } } ] ]')
True
>>> 

答案 1 :(得分:0)

通常,当您尝试扩展到所链接文章中描述的较大问题时,您要查找的问题类别是无上下文语法解析器。这是一个非常经典的问题

http://en.wikipedia.org/wiki/Context-free_grammar#Well-formed_nested_parentheses_and_square_brackets

甚至将规范视为编译理论和相关主题的介绍。

一个简单的自上而下的解析器很容易实现http://effbot.org/zone/simple-top-down-parsing.htm

像Early这样的图表解析器更难,但有150行实现可用https://github.com/tomerfiliba/tau/blob/master/earley3.py

您也可以使用解析器生成器。

任何其他方法在开始时看起来都不错,但这将是唯一可以扩展的策略

答案 2 :(得分:0)

我认为您可以将列表用作stack来查看所有括号是否匹配,如下所示:

def checkio(expr):
    a_stack = []
    for i in expr:
        if i in '({[':
            a_stack.append(i)
        elif i in '}])':
            if a_stack == []:
                return False
            else:
                poped = a_stack.pop()
                if poped == '(' and i != ')':
                    return False
                elif poped == '[' and i != ']':
                    return False
                elif poped == '{' and i != '}':
                    return False
    return len(a_stack) == 0

print checkio("((5+3)*2+1)") == True
print checkio("{[(3+1)+2]+}") == True
print checkio("(3+{1-1)}") == False
print checkio("[1+1]+(2*2)-{3/3}") == True
print checkio("(({[(((1)-2)+3)-3]/3}-3)") == False
print checkio("2+3") == True

首先将一个char插入堆栈,然后弹出一个并查看它们是否匹配,最后也看看堆栈是否为空。