Как вынуть элемент из itertools.permutations? - PullRequest
0 голосов
/ 07 ноября 2019
from itertools import permutations
perms = permutations("hello",5)

Это дает мне странную <> вещь, которую я не понимаю. Кажется, это работает, чтобы идти

for i in perms:
    print(i)

Но я не хочу пробежаться по всем перестановкам, поскольку их очень много. Поэтому я хочу иметь возможность сделать что-то вроде

perms[index]

(«h», «e», «l», «l», «o»). Но это ломается, потому что это «не по подписке». Итак, как я могу получить только ("ч", "е", "л", "л", "о") из этого? Спасибо!

1 Ответ

1 голос
/ 07 ноября 2019

Если вы хотите получить перестановку nth последовательности в лексикографическом порядке без необходимости их генерации, вы можете использовать этот фрагмент, адаптированный с здесь :

from functools import reduce

def Factorial (n):
    return reduce(lambda x, y: x * y, range(1, n + 1), 1)

def GetNthPermutation (seq, index):
    seqc = list(seq[:])
    result = []
    fact = Factorial(len(seq))
    index %= fact
    while seqc:
        fact = fact // len (seqc)
        choice, index = index // fact, index % fact
        result += [seqc.pop(choice)]
    return result

который вы можете использовать так:

>>> print(GetNthPermutation(list("hello"), 3))
['h', 'e', 'l', 'o', 'l']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...