Это немного плотно, но itertools
ваш друг здесь:
import itertools as itr
ops = ["+","-",""]
expr = "123"
vals = itr.product(ops,repeat=len(expr)-1)
print [''.join([x+y for x,y in zip(expr,v)])+expr[-1] for v in vals]
['1 + 2 + 3', '1 + 2-3', '1 + 23', '1-2 + 3', '1-2-3', '1-23', '12 +3 ', '12 -3', '123']
Настоящая магия здесь исходит от функции product
, которая принимает правильное количество комбинаций с заменой (которые также можно использовать). Как мы узнаем, сколько терминов нам нужно? Похоже, вы можете вставить операцию только между любыми двумя значениями выражения, поэтому нам нужно len(expr)-1
значения для вставки. Полезно посмотреть на вывод:
list(itr.product([1,3,5],repeat=2))
[(1, 1), (1, 3), (1, 5), (3, 1), (3, 3), (3, 5), (5, 1), (5, 3 ), (5, 5)]
т.е. мы получаем каждую комбинацию, отбирая два элемента из списка, где важен порядок. Последняя печатная строка в ответе - это просто клей, который соединяет два выражения, обеспечивая завершение последнего термина expr[-1]
в конце.