2015-03-20 7 views
0
from collections import Counter 
x = '((()))' 

print Counter(x) 

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

Мне нужно сравнить, являются ли открытые скобки и близкие скобки моей строки равными или нет. Я использовал счетчик, чтобы сделать это. Но как мне сравнить два значения переменной счетчика?сравнить скобки в python

+1

- скобки, всегда упорядоченные, открываются, затем закрываются, то есть они не будут идти '()()'? –

+1

@en_Knight Я пытался решить эту проблему (http://interactivepython.org/runestone/static/pythonds/BasicDS/BalancedSymbols(AGeneralCase).html), и да, это будет fo '()()', а также –

+0

Oh okay , Использовать регулярное выражение! (просто шучу, пожалуйста, никто не причинил мне вреда) –

ответ

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 
>>> 
+0

Но проблема возникает, когда у меня есть больше символов '[[{{(())}}]]' –

+0

Вы можете просто расширить 'return', проверить мое редактирование. –

+0

Не слишком ли сложно. любой способ сделать это с помощью 'Counter'? –

0

В общем, когда вы пытаетесь распространяются на большую проблему, описанную в статье, которую вы связали, класс проблем, которые вы e ищет анализаторы контекстно-грамматических граммов. Это очень классическая проблема

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

Вы также можете использовать генератор парсеров.

Любой другой подход может показаться хорошо в начале, но это будет единственная стратегия, которая будет масштабироваться

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 

Первый толчок полукокса в стек, а затем вставьте карту и посмотреть, если они совпадают, наконец тоже увидеть, если стек пуст.

Смежные вопросы