Напишите функцию, чтобы изменить определенную строку определенным образом, добавив символ - PullRequest
6 голосов
/ 26 марта 2020

Мне нужно написать функцию, которая принимает строку и возвращает строку с добавленными символами "звездочек" или "*" для умножения сигнала.

Как мы знаем, 4 (3) - это еще один способ показать умножение, а также 4 * 3 или (4) (3) или 4 * (3) et c. В любом случае, мой код должен решить эту проблему, добавив звездочку между 4 и 3 для случая, когда умножение отображается с PARENTHESIS, но без оператора умножения "*".

Некоторые примеры:

  • "4 (3)" -> "4 * (3)"
  • "(4) (3)" -> "(4) * (3)"
  • " 4 * 2 + 9 -4 (-3) "->" 4 * 2 + 9 -4 * (- 3) "
  • " (- 9) (- 2) (4) "->" (-9) * (2) * (4) "
  • " 4 ^ (3) "->" 4 ^ (3) "
  • " (4-3) (4+) 2) "->" (4-3) * (4 + 2) "
  • " (Aflkdsjalkb) (g) "->" (Aflkdsjalkb) * (g) "
  • " g (d) (f) "->" g * (d) * (f) "
  • " (4) (3) "->" (4) * (3) "

Я не совсем уверен, как это сделать, я думаю о том, чтобы найти левую скобку и затем просто добавить «*» в этом месте, но это не сработает, поэтому начало моего третьего примера будет выводить «* (-9)» - это то, что я не хочу, или мой четвертый пример, который вывел бы «4 ^ * (3)». Есть идеи, как решить эту проблему? Спасибо.

Вот что я пробовал, и, очевидно, это не работает:

while index < len(stringtobeconverted)
    parenthesis = stringtobeconverted[index]
    if parenthesis == "(":
        stringtobeconverted[index-1] = "*"

Ответы [ 5 ]

3 голосов
/ 26 марта 2020

tl; dr - Вместо того, чтобы думать об этом как о преобразовании строки, вы можете:

  1. Разобрать входную строку в абстрактный представление.

  2. Генерация новой выходной строки из абстрактного представления.


Разбор входных данных для создания абстрактного синтаксического дерева, а затем генерация новая строка.

Как правило, вы должны:

  1. Создать логическое представление для математических выражений. Вы захотите построить абстрактное синтаксическое дерево (AST) для представления каждого выражения. Например,

    2 (3 (4) +5)

    может быть сформировано в виде дерева:

      *
     /  \
    2    +
        /  \
       *    5
      /  \
     3    4
    

    , где каждый узел в этом дереве (2, 3, 4, 5, оба * и +) каждый является объектом, который имеет ссылки на свои дочерние объекты .

  2. Запишите лог c для анализа ввода. Напишите логи c, которые могут анализировать "2(3(4)+5)", в абстрактное синтаксическое дерево, представляющее его значение.

  3. Пишите логи c для сериализации данных. Теперь, когда у вас есть данные в концептуальной форме, вы можете написать методы, которые преобразуют их в новый желаемый формат.


Примечание: преобразования строк могут быть проще для быстрого scripting.

Как показали другие ответы, прямое преобразование строки может быть проще, если все, что вам нужно, это быстрый скрипт, например, у вас есть текст, который вы просто хотите переформатировать очень быстро. Например, как показывает @ ответ PaulWhipp , регулярные выражения могут сделать такой сценарий действительно быстрым и легким.

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

3 голосов
/ 26 марта 2020
In [15]: def add_multiplies(input_string): 
    ...:     return re.sub(r'([^-+*/])\(', r'\1*(', input_string) 
    ...:      
    ...:      
    ...:                                                                                                                                    

In [16]: for example in examples: 
    ...:     print(f"{example} -> {add_multiplies(example)}") 
    ...:                                                                                                                                    
4(3) -> 4*(3)
(4)(3) -> (4)*(3)
4*2 + 9 -4(-3) -> 4*2 + 9 -4*(-3)
(-9)(-2) (4) -> (-9)*(-2) *(4)
4^(3) -> 4^*(3)
(4-3)(4+2) -> (4-3)*(4+2)
(Aflkdsjalkb)(g) -> (Aflkdsjalkb)*(g)
g(d)(f) -> g*(d)*(f)
(g)-(d) -> (g)-(d)
2 голосов
/ 26 марта 2020

Я поделюсь с вами.

def insertAsteriks(string):

    lstring = list(string)
    c = False

    for i in range(1, len(lstring)):

        if c:
            c = False
            pass
        elif lstring[i] == '(' and (lstring[i - 1] == ')' or lstring[i - 1].isdigit() or lstring[i - 1].isalpha() or (lstring[i - 1] == ' ' and not lstring[i - 2] in "*^-+/")):
            lstring.insert(i, '*')
            c = True

    return ''.join(lstring)

Давайте проверим ваши входные данные.

print(insertAsteriks("4(3)"))
print(insertAsteriks("(4)(3)"))
print(insertAsteriks("4*2 + 9 -4(-3)"))
print(insertAsteriks("(-9)(-2) (4)"))
print(insertAsteriks("(4)^(-3)"))
print(insertAsteriks("ABC(DEF)"))
print(insertAsteriks("g(d)(f)"))
print(insertAsteriks("(g)-(d)"))

Вывод:

4*(3)
(4)*(3)
4*2 + 9 -4*(-3)
(-9)*(-2) (4)
(4)^(-3)
ABC*(DEF)
g*(d)*(f)
(g)-(d)

[Finished in 0.0s]
0 голосов
/ 26 марта 2020

Один из способов - использовать простую замену. Случаи, подлежащие замене:

  • ) (->) * (
  • N (-> N * (
  • ) N ->) * N

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

Более интересным способом было бы использовать вид рекурсии с поддельными связанными списками :) У вас есть сущности и операторы. Сущность может быть числом сама по себе или чем-либо, заключенным в скобки. Все остальное является оператором. Как примерно так: Для каждой строки найдите все сущности и операторы (например, сохраните их в списке). Затем для каждой сущности посмотрите, есть ли внутри еще сущности. Продолжайте делать это, пока в каких-либо объектах не останется больше сущностей. Затем, начиная с самого нижнего (самого маленького из сущностей), посмотрите, есть ли оператор между двумя смежными сущностями, если нет, вставьте туда звездочку. Сделайте это до самого верхнего уровня. Снова начните снизу и соберите все части.

0 голосов
/ 26 марта 2020

Вот код, протестированный на ваших примерах:

i = 0
input_string = "(4-3)(4+2)"
output_string = ""

while i < len(input_string):
    if input_string[i] == "(" and i != 0:
        if input_string[i-1] in list(")1234567890"):
            output_string += "*("
        else:
            output_string += input_string[i]
    else:
        output_string += input_string[i]
    i += 1

print(output_string)

Здесь ключ к пониманию логики c, которую вы хотите достичь, что на самом деле довольно просто: вы просто хотите добавить несколько «*» перед открытием скобки на основании нескольких условий.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...