Расставить операторы между числами чтобы получить значение Python

Нужно расставить операторы между num = 99999 - чтобы получить например number = 100. (num,number) могут быть разными. Что я сделал.

import itertools
from itertools import zip_longest

num = 99999
number = 100
mat_zn = '+-*/'

list_mat_zn = list(mat_zn)
list_num = list(str(num))
iter_mat_zn = list(itertools.product(mat_zn, repeat=len(list_num)-1))

res = []
for zn in iter_mat_zn:
    res.append(list(zip_longest(list_num,zn)))

Получил res, укорочен.

res = [[('9', '+'), ('9', '+'), ('9', '+'), ('9', '+'), ('9', None)], [('9', '+'), ('9', '+'), ('9', '+'), ('9', '-'), ('9', None)]]

Дальше пока теряюсь. Теперь нужно каждый i из res превратить в формулу. Избавившись от None(это не проблема) Можно через перегрузку операторов в классах, но я там не силен. Еще через operator может быть еще? Какие еще варианты есть более правильные?


Ответы (1 шт):

Автор решения: user207200
from itertools import product, chain, zip_longest

N = 99999
tgt = 90
nstr = str(N)

for var in filter(lambda expr: eval(expr) == tgt,
                  map(lambda ops: ' '.join(chain(*zip_longest(nstr, ops, fillvalue=""))),
                      product('+-*/', repeat=4))):
    print(f'{var}= {tgt}')  # -> 9 + 9 + 9 * 9 - 9 = 90 ...

Немного комментариев к коду, не являющемуся образцом читаемости.

В первую очередь сделан упор на использование генераторных выражений (product, map, filter) для ухода от материализации всех промежуточных значений.

Описание самого процесса:

  1. product генерирует все возможные комбинации арифметических знаков.
  2. map передает в лямбду каждую комбинацию, где она "сшивается" (zip_longest) со строковым представлением набора чисел (операндов).
  3. В лямбде фильтра происходит выполнение выражения и сравнение с искомым значением.
→ Ссылка