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
!