PYTHON: как заставить внутреннюю функцию возвращать по одному значению за раз и в зависимости от условий внешней функции решить, запускать или останавливать? - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь придумать способ написать эффективные перестановки для проблемы, которую я пытаюсь решить. Я просмотрел всю документацию NumPy и SymPy и не нашел ничего, что помогло бы с тем, что я знаю.

Что мне нужно: Я хочу создать выборочную функция перестановки, которая вместо того, чтобы возвращать все возможные перестановки, просто возвращает одну перестановку, одну за другой.

Общее представление о процессе: внешняя функция вызывает мою функцию выборочной перестановки, и эта функция возвращает ОДНО значение для оценки внешней функции. Если он передает условный оператор внешней функции, то все готово, в противном случае он снова вычисляет внутреннюю функцию для следующего значения и т. Д.

Я читал о реализации yield, но не уверен, как чтобы сделать это в этом случае.

Если у кого-то есть какие-либо советы о том, как возвращать по одному значению за раз и в зависимости от внешнего условия решить, запускать или останавливать , я был бы очень признателен .

Ответы [ 2 ]

2 голосов
/ 02 августа 2020

Python s itertools.permutations уже делает это -

from itertools import permutations

for p in permutations("abcd", 2):
  print(p)
  if p == ("b","c"):
    break

print("done")
('a', 'b')
('a', 'c')
('a', 'd')
('b', 'a')
('b', 'c')
done

Это потому, что itertools.permutations возвращает своего рода ленивый генератор, а не вычисляет все перестановки заранее.

print(permutations("abcd", 2))
# <itertools.permutations object at 0x7f26ebd0bf40>

Если вам нужны все перестановки, вам нужно будет собрать их в list -

print(list(permutations("abcd", 2)))
# [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'a'), ('b', 'c'), ('b', 'd'), ('c', 'a'), ('c', 'b'), ('c', 'd'), ('d', 'a'), ('d', 'b'), ('d', 'c')]

Вот как это может выглядеть в программе

def solve (values, size, check):
  for p in permutations(values, size):
    if (check(p)):
      return p

answer = \
  solve \
    ( [ 5, 3, 9, -4, 7 ]     # nums to check
    , 3                      # permutation size
    , lambda p: sum(p) == 10 # find permutation that adds to 10
    )

print(answer)
# (5, 9, -4)

И ответ подтверждается: 5 + 9 + -4 равно 10!

0 голосов
/ 02 августа 2020

Это должно быть довольно просто:

def innerFunction(your_inputs):
   #Generate Permutations & combinations
   for permutation in all_permutations:
       yield permutation

def OuterFunction():
    for permutation in innerFunction():
          if condition:
              break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...