Вы можете использовать functools.reduce
дважды, хотя результат не очень чистый:
from functools import reduce
from operator import sub, add
eq = ['12', '2', '3', '-123', '-1', 'X']
_x = [6, 4, 1, 4, 5, 2, 4, 23, 2, 4]
final_result = reduce(lambda x, y:[add, sub][y.startswith('-')](
reduce(lambda c, d:c*d, [_x[int(i)] for i in x]) if x in eq else x,
reduce(lambda c, d:c*d, [_x[int(i)] for i in (y[1:] if y.startswith('-') else y)] if y != 'X' else [1])
), eq)
print(final_result)
x = _x
print(x[1]*x[2] + x[2] + x[3] - x[1]*x[2]*x[3] - x[1] + 1)
Выход:
-10
-10
Но опять же, предопределенную функцию гораздо легче читать и масштабировать.
Также, немного короче, с sum
:
new_result = sum([1, -1][i.startswith('-')]*reduce(lambda x, y:x*y, [1] if i == 'X' else [x[int(c)] for c in (i[1:] if i.startswith('-') else i)]) for i in eq)