from collections import Counter
x = '((()))'
print Counter(x)
Counter({')': 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插入堆栈,然后弹出一个并查看它们是否匹配,最后也看看堆栈是否为空。