2015-05-01 18 views
5

Czy istnieje sposób uzyskania indeksów pasujących nawiasów w ciągu znaków? Na przykład ten:Indeksy pasujących nawiasów w języku Python

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

Chciałbym dostać słownika z wartości:

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

co oznacza, że ​​nawiasy na indeksie 4 i 14 są dopasowane, 7 i 8 to tak dalej. Wielkie dzięki.

+1

Jest oczywiste, że istnieje [tylko jeden oczywisty sposób] (http://programmers.stackexchange.com/questions/96411/concrete-examples-of-pythons-only-one-way-to-do-it- maxim) do pisania prostych algorytmów w Pythonie, ponieważ w ciągu 5 minut otrzymałeś trzy razy praktycznie tę samą odpowiedź. –

Odpowiedz

6

To znaczy, zautomatyzowany sposób? Nie sądzę.

Musisz utworzyć program, korzystając ze sterty , w którym przesuwasz indeks po znalezieniu otwartego nawiasu i wysuwasz go, gdy znajdziesz nawias zamykający.

W Pythonie, można łatwo używać listy jako stosie, ponieważ mają metody append() i 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 

Mam nadzieję, że to pomoże.

+1

Tak, to działa, wielkie dzięki. –

+0

Nie ma za co. – Baltasarq

+0

Zgadzam się, że stos jest drogą do zrobienia. To jednak przechwytuje niezbalansowane _open_ nawiasy, jednak: zbyt wiele _close_ nawiasów spowoduje pop z pustej listy. – xnx

4

Standardowym sposobem sprawdzenia zrównoważonych zamków jest użycie stosu. W Pythonie, można to zrobić poprzez dołączenie do popping ze standardowej listy:

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) 

Wynik:

In [58]: d 
Out[58]: {4: 14, 7: 8, 9: 10}