Может ли кто-нибудь объяснить, как работает этот код?

#python #python-3.x

Вопрос:

 def validBraces(s):
 while '{}' in s or '()' in s or '[]' in s:
  s=s.replace('{}','')
  s=s.replace('[]','')
  s=s.replace('()','')
return s == ""
 

Я нашел этот код в качестве решения в codewars или для проверки фигурных скобок
Я пытался хлюпать головой, но все еще не могу понять, как это работает

Вкл print(validBraces(s)) ., где s = {[]} он возвращает True

Но, когда s = {ab} , он возвращается False . Кроме того, replace("ab","#") изменится только "ab" (верно?), а не "a" и "b" .

Я новичок и не понимаю этого. Кто-нибудь может объяснить?

Комментарии:

1. Он работает только со строками, которые полностью состоят из фигурных скобок.

2. Попробуйте запустить некоторые допустимые/сбалансированные, а также недопустимые фигурные скобки в pythontutor.com

3. Я предполагаю, что в соответствии с утверждением это должно работать только для строк, которые содержат только фигурные скобки (или вам сначала нужно удалить все символы, не содержащие фигурных скобок). Он в основном заменяет пары фигурных скобок изнутри наружу. Однако было бы более эффективно использовать стек.

4. «замена(«ab»,»#») изменит только «ab», верно? и не «а», а «б». Это правда, но вам также легко проверить это самостоятельно. Что вы пытались проверить самостоятельно?

5. Строковая replace функция в Python не использует регулярные выражения ( re для этого существует модуль), поэтому вы, конечно, правы в своем предположении, что ввод с заменой 'ab' будет искать это точное совпадение в строке (в отличие от a и затем b ).

Ответ №1:

Код python работает таким образом…

Пока есть подстрока «{}», «()», или «[]»

  1. замените все вхождения «{}» на «» (пустая строка)
  2. замените все вхождения «()» на пустую строку
  3. замените все вхождения «[]» на пустую строку

Если строка теперь равна пустой строке, верните значение True. В противном случае мы вернем false.

Но, когда s = {ab}, он возвращает False

Если вы имеете в виду, что когда s = "{ab}" , то это не приведет к пустой строке, потому что код для замены подстроки «ab» пустой строкой не находится в этом цикле while.

Кроме того, замена(«ab»,»#») изменит только «ab», верно? и не «а», а «б».

Да, это заменит только буквальное вхождение «ab» на»#», но не «a» или «b». Например…

replace("ab", "#")

  • «{ab}» изменится на» {#}».
  • «{a}» останется неизменным
  • «{b}» останется неизменным.

Ответ №2:

Сравнение внутри условия while проверяет, присутствует ли конкретная строка в данном случае «{}» или «()» или » []», если какая-либо из них присутствует, то она заменяется«», которая пуста. Технически заменить что-либо на «» означает, что вы удаляете его, используя метод замены в Python.

 `return s == ""` after all the replacements are done the code checks if the finally updated string **s** is equal to "" or is **s** empty or not, if it is then it returns **True** else **False**

`replace("ab","#")` this will change all the "ab" in the given string variable and not separate **a** and **b**.
 

Пример : s = «abba»
s = s.заменить(«ab»,»t»)
теперь s-это «tba»

Комментарии:

1. Пожалуйста, укажите дополнительную информацию в своем ответе. Как это написано в настоящее время, трудно понять ваше решение.