Форум сайта python.su
Помогите, пожалуйста, разобраться. Нужно чтобы программа проверяла правильность расстановки скобок в файле(у каждой открывающей скобки должна быть закрывающая скобка). И если скобки расставлены неверно, то есть открывающих или закрывающих скобок больше, чем положено, программа должна возвращать номер строки и колонки лишней скобки.
С проверкой на правильность расстановки скобок проблем нет, вот мое решение:
def isBalanced(file): with open(file) as f: strInput = f.read() if strInput: brackets = [ ('(',')'), ('[',']'), ('{','}')] kStart = 0 kEnd = 1 stack = [] for char in strInput: for bracketPair in brackets: if char == bracketPair[kStart]: stack.append(char) elif char == bracketPair[kEnd] and len(stack) > 0 and stack.pop() != bracketPair[kStart]: return False if len(stack) == 0: return True return False
def line_col(symbol,file): with open(file) as myFile: for num, line in enumerate(myFile, 1): if symbol in line: idx = line.index(symbol) print ('symbol at line:', num,'symol at column:', idx)
Офлайн
Во-первых, не надо весь файл целиком считывать за один раз. Нужно читать построчно, тогда и строку будет легко найти. (Но тут главное, что файл может оказаться огромным и не поместиться в память.)
Во-вторых, в функцию надо не имя файла подавать, а поток строк, потому что поток строк может быть откуда угодно, хоть по сети прийти.
И вот когда у тебя есть поток строк, тогда ты можешь знать номер текущей строки и номер символа в ней.
0x01brackets = [ ('(',')'), ('[',']'), ('{','}')]
brackets = ('()', '[]', '{}')
0x01if len(stack) == 0: return True
if not stack: return True
Отредактировано py.user.next (Окт. 31, 2016 20:49:40)
Онлайн
py.user.next спасибо за идею со чтением построчно.
По поводу параметра, мне нужно именно файл использовать как параметр и эта программа рассчитана на небольшие файлы во избежание трудностей.
По поводу скобок поняла поправку, а вот со стаком не очень. Что принципиально меняет if not stack: return True?
Офлайн
0x01Оно короче, понятнее и меньше операций требует. В логических проверках пустой стек ложный, а непустой - истинный. Вычисление длины может занимать какое-то время. Где-то он возьмёт хранящееся значение длины, а где-то он будет перебирать все элементы, чтобы посчитать. Если эта функция вызывается потом для тысячи файлов каждый день, то тысячу раз каждый день будет иметь значение, как быстро там всё происходит.
Что принципиально меняет if not stack: return True?
0x01Значит, нужно сделать две функции. Одна открывает файл и передаёт его во вторую, вторая принимает набор строк и возвращает, например, None, если всё правильно, либо кортеж с номером строки и номером символа, если там ошибка. Дальше первая функция берёт этот кортеж возвращённый и формирует соощение об ошибке.
По поводу параметра, мне нужно именно файл использовать как параметр и эта программа рассчитана на небольшие файлы во избежание трудностей.
Отредактировано py.user.next (Ноя. 1, 2016 04:24:49)
Онлайн