Remove redundant parentheses python что это

Python. How to remove redundant/wrong parentheses in string

For example input string:

As a result I expect:

It’s like result should contain all «healthy» blocks, which has open «(» and closed «)» + «healthy» text between them. All sick parts should be removed: «fo)» and «o)» because they are not involved in «()» and they are not between «()» or are not included in «()»

One more example for check:

should return (OMG)123()qwe(zxc)

I will that it can be resolved as with re module as regular script. But I have no idea which algorithm should be used.

PS: I will not refuse from any help. 🙂

Remove redundant parentheses python что это. photo. Remove redundant parentheses python что это фото. Remove redundant parentheses python что это-photo. картинка Remove redundant parentheses python что это. картинка photo

1 Answer 1

There is very good example for using stacks and nearly every CS student solved this at least once. Check this as an example but you can find much better syntax (specially written for C++).

These solutions are usually for checking if the statement is correct or not, but you can use same logic to remove wrong parts and only save the ones that match. So just create new string variable ( variable=»» ), iterate over string and check for parenthesis, if they are in correct place then add them to that variable. To check parenthesis order, use Stack object, when you will see opening parenthesis push that to the stack and then continue, when it will be closing one, then pop the last value from stack and check (new item is ) and last item in stack should be ( ). If they don’t match, throw away that part and continue, if they match then add that part to string.

Источник

Удалить лишние круглые скобки из арифметического выражения

Это вопрос интервью, для которого я не нашел удовлетворительных ответов на stackoverflow или снаружи. Описание проблемы:

Учитывая арифметическое выражение, удалите лишние круглые скобки. Например. ((a * b) + c) должно стать a * b + c

ОТВЕТЫ

Ответ 1

окружающие операторы являются <+, *>, а оператор с наименьшим приоритетом внутри круглых скобок равен *, поэтому скобки не нужны. С другой стороны, в

в круглых скобках есть оператор меньшего приоритета +, чем окружающий оператор *, поэтому они необходимы. Однако в

скобки не нужны, поскольку внешний * не привязан к выражению в скобках.

Почему это так: если все операторы внутри выражения (X% X%. % X) имеют более высокий приоритет, чем окружающий оператор, тогда внутренние операторы в любом случае рассчитываются сначала, даже если скобки удалены.

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

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

(Обработка пар слева направо):

Ответ 2

Я только что понял ответ:

пожалуйста, помните об этом: набор не уникален, например, ((a + b)) * c, мы можем удалить внешние скобки или внутренние, но окончательное выражение уникально

после сканирования до b, у нас есть стек:

теперь мы встречаем первый ‘)’ (в позиции 5), мы выставляем элемент

и предварительно прочитанный оператор ‘+’, так как min_op priority ‘*’ > ‘+’, поэтому пара (1,5) избыточна, поэтому выведите его. затем сканируйте, пока мы не встретим последний ‘)’, на данный момент у нас есть стек

мы выставляем этот элемент (поскольку мы встречаемся ‘)’ в позиции 8) и предварительно читаем следующий оператор, так как нет оператора и с индексом 0 нет left_op, поэтому выведите пару (0, 8)

когда мы встречаем ‘)’, стек выглядит так:

теперь мы выставляем элемент по индексу = 1, сравниваем min_op ‘+’ с left_op ‘*’ с индексом 0, мы можем узнать, что ‘(‘, ‘)’ необходимы

Ответ 3

Сканировать список маркеров

2.1, если токен является операндом, игнорировать.

2.2, если токен является оператором, записывает оператор в left_op, если min_op равно nil, установите min_op = этот оператор, если min_op не равен нулю, сравните min_op с этим оператором, установите min_op как один из двух операторов с меньшим приоритетом.

2.3, если токен оставлен в поле parenthese, нажмите один элемент в стеке, с left_pa = положением скобок.

2.4.1 у нас есть пара скобок (left_pa и правая скобка)

2.4.2 поместите элемент

2.4.3 предварительно прочитанный следующий токен, если он является оператором, установите его как правый оператор

2.4.4 сравнить min_op элемента с left_op и правым оператором (если любой из них существует), мы можем легко узнать, если пара круглых скобок является избыточным и выводит его (если min_op

Ответ 4

Эти решения работают, если выражение является действительным. Нам нужно сопоставить операторы с приоритетными значениями.

а. Пройдите с двух концов массива, чтобы определить совпадающие скобки с обоих концов. Пусть индексы равны я и j соответственно.

б. Теперь переходим от я к j и обнаруживаем оператор наименьшего приоритета, который не содержится внутри каких-либо круглых скобок.

д. Продолжайте шаги a до c, пока я

Ответ 5

Ответ 6

Я думаю, что вы ищете какой-то алгоритм, как показано на следующем рисунке.

Источник

Как я могу игнорировать функцию «redundant parentheses» в PyCharm?

Я смог проигнорировать другие предупреждения следующим образом:

Файл > Настройки > редактор > проверки > снимите все предупреждения, которые вам не нравятся..

К сожалению, предупреждение ‘redundant parentheses’ не появляется в этом списке.

Как я могу игнорировать это предупреждение?

2 ответа

Я пытаюсь установить пакет BeautifulSoup через PyCharm, я также пытался загрузить его через командную строку. Но я просто не могу добраться до него, чтобы запустить на PyCharm. Я постоянно получаю следующую ошибку Collecting BeautifulSoup Using cached BeautifulSoup-3.2.1.tar.gz Complete output.

Существует redundant parenthesis под контролем (PyCharm 2016.1.4). Посмотри внимательнее.

Похожие вопросы:

Моя программа анализирует многорядную строку SQL значений в однорядный строковый массив. Типичная входная строка выглядит следующим образом: (11,’-1′,’Service A (nested parentheses)’,’en’).

Я пытаюсь установить пакет BeautifulSoup через PyCharm, я также пытался загрузить его через командную строку. Но я просто не могу добраться до него, чтобы запустить на PyCharm. Я постоянно получаю.

например: если вход равен (5*x), то возвращаемый результат равен: Parentheses are placed correctly если вход равен (((5*x), то возвращаемый результат равен: Parentheses are placed incorrectly.

Я пытаюсь игнорировать определенную точку останова в pycharm в течение первых N раз, когда она попадает. Поскольку я хочу установить его на что-то вроде 10k, вручную делать это не вариант. Я нашел.

Есть несколько статей, объясняющих, как отключить проверку в PyCharm, щелкнув мой путь вокруг. Мне это не нравится, потому что: Это не работает для меня Я понятия не имею, что делает PyCharm Я хочу.

Источник

Remove redundant parentheses from an arithmetic expression

December 2018

22.3k time

This is an interview question, for which I did not find any satisfactory answers on stackoverflow or outside. Problem statement:

Given an arithmetic expression, remove redundant parentheses. E.g. ((a*b)+c) should become a*b+c

6 answers

Сканирование маркеров списка

2,1, если маркер является операнд, игнорировать.

2.2, если маркер является оператором, записывает оператор в left_op, если min_op равна нулю, установите min_op = этот оператор, если min_op не ноль, сравнить min_op с этим оператором, установить min_op в качестве одного из двух операторов с меньшими затратами приоритет.

2.3, если маркер остается Parenthese, нажать один элемент в стеке, с left_pa = положением скобки.

2,4, если лексема правая скобка:

2.4.1 мы имеем пару скобок (left_pa и правая скобка)

2.4.3 предварительно прочитать следующий токен, если он является оператором, установить его как оператор правого

Я думаю, что вы ищете вид алгоритма, как показано на следующей фотографии.

Этот алгоритм «почти» готов, так как много ошибок возникают после того, как более сложным он становится, тем сложнее становится. То, как я работаю на этой вещи, является «строить и запись-код-на-лету», что означает, что до 4-х круглых скобок, вещи легко. Но после того, как выражение идет более сложным, есть вещи, которые я не могу предсказать, в то время как записывать мысли на бумаге. И приходит компилятор, чтобы сказать мне, что исправить. Это не было бы ложью, если я утверждаю, что это не я написал алгоритм, но (C #) компилятор вместо этого! До сих пор, это заняло у меня 1400 линий. Это не то, что команды было трудно писать. Это было их расположение, что была настоящая головоломка. Эта программа, которую вы ищете, характеризуется очень высокой степенью сложности. Ну, если вам нужны какие-либо первичные идеи, пожалуйста, дайте мне знать, и я отвечу.

Я просто понял, ответ:

следует помнить о том, что: множество не является уникальным, например, ((а + б)) * с, мы можем удалить внешние скобки или внутренние один, но окончательное выражение является уникальным

после сканирования до Ь, мы стек:

Теперь мы встречаемся с первым «)» (в позиции 5), мы вытолкнуть деталь

и предварительно читаемый оператор «+», так как min_op приоритет «*»> «+», так что пара (1,5) является избыточным, так что выводит его. отсканировать пока мы не встретимся в последний раз «)», на данный момент, мы стек

мы совать этот пункт (так как мы встречаем «)» в позиции 8), и предварительно прочитать следующий оператор, так как нет никакого оператора и по индексу 0, нет left_op, поэтому выход пара (0, 8)

когда мы встречаем «)», стек, как:

Теперь мы вытолкнуть элемент с индексом = 1, сравните min_op «+» с left_op «*» с индексом 0, мы можем выяснить «(», «)» необходимо

Это решение работает, если выражение является допустимым. Нам необходимо отображение операторов к приоритетным ценностям.

а. Траверса с двух концов массива, чтобы выяснить, соответствующий скобку с обоих концов. Пусть индексы будут я и J соответственно.

б. Теперь траверс от I до J и выяснить, наименьший оператор старшинства, который не содержится внутри каких-либо скобок.

окружающие операторы <+ *>, а самый низкий приоритет операторов внутри скобок *, поэтому круглые скобки не нужны. С другой стороны, в

существует нижний оператор старшинства + в скобках, чем окружающий оператор *, поэтому они необходимы. Тем не менее, в

круглые скобки не нужны, потому что внешний * не привязаны к выражению в скобках.

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

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

Источник

Python program to remove invalid parentheses

Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results.

So, I would like to know whether I could make this program shorter and more efficient.

Any help would be highly appreciated.

2 Answers 2

Test, consistent behavior & data structure

Trying to add tests for the code based on the example of input/output provided led to the following result: the behavior is not consistent : in particular the order of the elements in the returned list is not always the same.

The root cause for this is that we are using sets in the logic only to convert to list at the end.

A solution would be to return sorted(results) at the end. An alternative would be to just return a set instead of trying to convert to list.

Then, we get the following automated tests:

It would make sense to try to rewrite it as unit-tests using a proper unit-test framework but I will stop here as this is enough for me to keep working.

More explicit loop

Similar indices

At this stage, we have:

(I took this chance to add a new test case)

More explicit loop again

We want to iterate in reversed order over the beginning of the s string. Here again, we can try to make things more explicit and remove some computation as we go:

In order to test this more throughly, I took this chance to add the following test case:

More beautiful loops

Instead of using a combination of while and pop to iterate over the elements of a set, you can just use for :

Work in progress: I have to go. I may continue in the future.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *