Вы можете сделать это с помощью регулярных выражений , если хотите. Преимущество такого подхода состоит в том, что вы будете знать, совпадает ли ваш ввод немедленно, и каковы все элементы, когда вы запрашиваете объект сопоставления.
Показанное здесь решение опирается на re.match
для многократного нахождения терминов в вашем уравнении. Преимущество такого подхода заключается в том, что вы можете сложить коэффициенты, чтобы учесть термины с повторяющимися показателями. Это также упрощает добавление поддержки терминов, выходящих за рамки квадратичной.
Результатом будет словарь с индексом экспоненты (0 для постоянного члена), со значением общего коэффициента aa.
Приведенное здесь регулярное выражение основано на шаблоне сопоставления чисел, взятых из этого ответа до этого вопроса :
import re
from collections import defaultdict
string = '-12.5e-1 x^3 + -5 x^2 --0.5x +-0.75x^3 +6'
number = r'[-+]?(?:(?:\d*\.\d+)|(?:\d+\.?))(?:[Ee][+-]?\d+)?'
pattern = re.compile(fr'\s*([+-])\s*({number})\s*(x(\^\d+)?)?')
coefficients = defaultdict(int)
# prepend a + to avoid special-casing the first term
string = '+' + string.rstrip()
while string:
match = pattern.match(string)
if not match:
raise ValueError(f'Invalid input starting with {string}')
sign = 1 if match.group(1) == '+' else -1
coefficient = sign * float(match.group(2))
if match.group(3):
exp = match.group(4)
exp = 1 if exp is None else int(exp[1:])
else:
exp = 0
coefficients[exp] += coefficient
string = string[match.end():]
Для примера string
, получившиеся coefficients
равны
defaultdict(<class 'int'>, {0: 6.0, 1: 0.5, 2: -5.0, 3: -2.0})
Вот ссылка UDEOne: https://ideone.com/TwtY2e