0

Good afternoon. Help with the definition of the symbol in the string. Добрый день. Помогите с определением символа в строке

Уже запутался. Если Знак "+" в первом примере - все работает. Если знак например "*" , все равно заходит в проверку if "+" Already confused. If the "+" sign in the first example - everything works. If the character is "*", it still checks if "+" Find which math expression matches the answer that you are given, if you have an integer answer, and a list of math expressions. Task: Test each math expression to find the first one that matches the answer that you are given. Input Format: Two inputs: an integer and a space separated string of math expressions. The following operations need to be supported: addition +, subtraction -, multiplication *, division /. An expression can include multiple operations. Output Format: A string that tells the index of the first math expression that matches. If there are no matches, output 'none'. Sample Input: 15 (2+100) (5*3) (14+1) Sample Output: index 1 https://code.sololearn.com/cndxc3ExtA09/?ref=app

23rd Feb 2020, 2:49 PM
Aleksandr Yermakov
Aleksandr Yermakov - avatar
6 ответов
+ 2
string find() method will returtn -1 if it is not find a substring. -1 is true, so your "if" is executed even if substring doesn't exist in the string. you should check result of find on unequality to -1 if f.find("+") != -1: если метод find не находит вхождение подстроки он возвращает -1 -1 имеет логическое значение истинна, поэтому условный оператор будет выполнен, даже если подстрока не присутствует в строке. нужно проверять на неравенство -1: if f.find("+") != -1: You can simplify your code like this: Код может быть упрощен: t = "(2*100) (200/100) (2-100) (5*3) (14+1)" rez = int(15) string = t.split() index = 0 for st in string: if eval(st) == rez: print(index) break index += 1;
23rd Feb 2020, 3:20 PM
andriy kan
andriy kan - avatar
+ 2
Александр, пожалуйста. eval() должна действительно использоваться с осторожностью, особенно если вы используете ее для работы со строкой, полученной из "внешнего мира". В этом случае "злоумышленник" может передать в строке вредоносный код, который будет выполнен eval. Вторым аргументом функции желательно передавать пустой словарь eval(st, {}). Поступающую строку лучше фильтровать. Но это для работы с "внешним миром". Я не знаю для чего будет использоваться Ваш код, поэтому не знаю нужно ли принимать защитные меры или нет. Я думаю, Вы обратили внимание, что строка разбивается на "слова" по пробелам, поэтому наличие пробелов внутри скобок приведет к неправильной работе программы. Для устранения этого нужно будет удалить все пробелы из строки и, например, вставить их после закрывающихся скобок первого уровня. (или использовать другой способ)
24th Feb 2020, 2:06 PM
andriy kan
andriy kan - avatar
+ 2
Словарь глобальных переменных, которые могут быть доступны из строки, передаваемой в eval. Так как Вы не используете никакие переменные из своей программы внутри вычисляемого выражения, то и не имеет смысла открывать доступ к ним.
24th Feb 2020, 5:21 PM
andriy kan
andriy kan - avatar
0
Андрей, огромное спасибо за разъяснения. C методом find разобрался. А от упрощения кода я вообще в шоке, не знал про функцию eval() . Но читал что ее нужно аккуратно использовать. Причем Ваше решение, помимо компактности, более правильно решает поставленную задачу. "An expression can include multiple operations." в условии ставит просто крест на моем варианте. Так что еще раз Спасибо. Продолжаю учиться.... :)
24th Feb 2020, 1:22 PM
Aleksandr Yermakov
Aleksandr Yermakov - avatar
0
Код пишу только в в тренировочных целях. Решаю все подряд задачки в образовательных целях. Ну в будущем, если придется использовать ть эту функцию для работы со строкой из внешнего мира, буду иметь в ввиду. А какую функцию выполняет пустой словарь преданный вторым аргументом?
24th Feb 2020, 5:08 PM
Aleksandr Yermakov
Aleksandr Yermakov - avatar
0
Спасибо
24th Feb 2020, 5:49 PM
Aleksandr Yermakov
Aleksandr Yermakov - avatar