Raymond Hettinger wrote: > [Steven Bethard] > >>>I have a list of strings that looks something like: >>>lst = ['0', '0', '(*)', 'O', '(*', '*', '(*', '*))', '((*', '*)', '*)'] > > . . . > >>>I want the indices: >>>(2, 2), (4, 7), (6, 7), (8, 9) and (8, 10) > > opener_stack = [] > for i, elem in enumerate(lst): > for c in elem: > if c == '(': > opener_stack.append(i) > elif c == ')': > print opener_stack.pop(), i >
Thanks Raymond, this is definitely an elegant solution. It was also easy to add all the error checking I needed into this one. For the curious, my final solution looks something like: def indices(lst): stack = [] for i, elem in enumerate(lst): for c in elem: if c == '(': stack.append(i) elif c == ')' and not stack: raise Exception('")" at %i without "("' % i) elif c == ')': yield stack.pop(), i elif c == 'O' and stack: raise Exception('"O" at %i after "(" at %i' % (i, stack[-1])) elif c == '*' and not stack: raise Exception('"*" at %i without "("' % i) if stack: raise Exception('"(" at %r without ")"' % stack) Thanks again! STeVe -- http://mail.python.org/mailman/listinfo/python-list