#python #database #sympy #equation
#python #База данных #симпатичный #уравнение
Вопрос:
Я нашел библиотеки manu, такие Sympy
как python library, которые также находятся в тестировании, но не работают должным образом для синтаксического анализа.
Если у меня есть переменная, которую ABC
нужно умножить на 3
, но Sympy
представлять ABC
как A * B * C
Итак, есть какие-либо идеи о том, какой метод использовать для сохранения уравнения или формулы в базе данных и вычисления во время выполнения с динамически предоставляемым значением переменной?
Ответ №1:
Синтаксический анализ выражений в Python можно выполнить с помощью sympy
. Например, sympy
позволяет преобразовать ‘-5abc ^ 2’ в expression=-5*a*b*c**2
следующим образом:
from sympy.parsing.sympy_parser import parse_expr, standard_transformations, implicit_multiplication_application, convert_xor
transformations = (standard_transformations (implicit_multiplication_application, ))
expression = parse_expr('-5abc^2', transformations=transformations)
Возможно, вы захотите обратить процесс вспять (преобразовать выражение в LaTeX script), а затем просто вызвать sympy.latex(expression)
Вы можете найти больше информации в документации по синтаксическому анализу выражений sympy.
ОБНОВЛЕНИЕ: Предположим, ‘abc’ — это одна переменная. Тогда ‘-5abc ^ 2’ означает -5 квадратов abc. Для этого требуется определение пользовательского списка переменных, которые могут быть разделены при использовании split_symbols_custom(...)
преобразования. (Я также заменил implicit_multiplication_application
на implicit_multiplication
)
from sympy.parsing.sympy_parser import parse_expr, standard_transformations, implicit_multiplication, split_symbols_custom, _token_splittable, convert_xor
def can_split(symbol):
if symbol not in ('abc',):
return _token_splittable(symbol)
return False
transformation = split_symbols_custom(can_split)
transformations = (standard_transformations (transformation, implicit_multiplication, convert_xor))
expression = parse_expr('-5abc^2', transformations=transformations)
print(expression)
So '-5abc^2'
анализируется как '-5*abc**2'
сейчас. Это можно найти в документации split_symbols_custom
Комментарии:
1. Но в моем случае ABC — это переменная, имеющая значение 5 ABC. = 5 ABC — это одна переменная, а не отдельные символьные переменные
2. После некоторых усилий я прояснил ваше требование. Посмотрите на мой обновленный ответ. На самом деле, вам нужно включить еще одно преобразование в механизм синтаксического анализа, и оно вызывается
split_symbols_custom
над вашим пользовательским списком.3. Несмотря на мои уведомления, я обнаружил некоторые ошибки здесь, в моем обновлении. Я попытаюсь еще немного поиграть с этими преобразованиями, чтобы исправить это.
4. Основная проблема заключается в том, что добавление
transformation
параметра в список (а также его удаление) не имеет никакого эффекта, что противоречит документации : (