2015-05-01 4 views
5

Есть ли способ получить индексы совпадающих скобок в строке? Например, для этого:Индексы совпадающих круглых скобок в Python

text = 'aaaa(bb()()ccc)dd' 

Я хотел бы получить словарь со значениями:

result = {4:14, 7:8, 9:10} 

, что означает, что круглые скобки по индексу 4 и 14 согласования, 7 и 8 в так далее. Большое спасибо.

+1

Понятно, что существует [только один очевидный способ] (http://programmers.stackexchange.com/questions/96411/concrete-examples-of-pythons-only-one-way-to-do-it- максим) для написания простых алгоритмов в Python, так как вы получили в три раза практически тот же ответ в течение 5 минут. –

ответ

6

Вы имеете в виду автоматизированный способ? Я так не думаю.

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

В Python, вы можете легко использовать список как стек, так как они имеют append() и pop() методы.

def find_parens(s): 
    toret = {} 
    pstack = [] 

    for i, c in enumerate(s): 
     if c == '(': 
      pstack.append(i) 
     elif c == ')': 
      if len(pstack) == 0: 
       raise IndexError("No matching closing parens at: " + str(i)) 
      toret[pstack.pop()] = i 

    if len(pstack) > 0: 
     raise IndexError("No matching opening parens at: " + str(pstack.pop())) 

    return toret 

Надеюсь, это поможет.

+1

Да, это работает, спасибо большое. –

+0

Добро пожаловать. – Baltasarq

+0

Я согласен, что стек - это путь. Однако это приводит только к неуравновешенным скобкам _open_: слишком много скобок _close_ вызовут поп из пустого списка. – xnx

4

Стандартный способ проверки сбалансированных кронштейнов - использовать стек. В Python, это может быть сделано путем добавления к и выскакивают из стандартного списка:

text = 'aaaa(bb()()ccc)dd' 
istart = [] # stack of indices of opening parentheses 
d = {} 

for i, c in enumerate(text): 
    if c == '(': 
     istart.append(i) 
    if c == ')': 
     try: 
      d[istart.pop()] = i 
     except IndexError: 
      print('Too many closing parentheses') 
if istart: # check if stack is empty afterwards 
    print('Too many opening parentheses') 
print(d) 

Результат:

In [58]: d 
Out[58]: {4: 14, 7: 8, 9: 10} 
Смежные вопросы