En este post tenemos dos funciones en python para obtener la n-ésima permutación lexicográfica de un conjunto de elementos.
from functools import reduce def factorial(n): """calcula el factorial de un numero""" #si n es mayor a uno realiza el calculo if n > 1: return reduce(lambda x, y: x * y, range(1, n + 1)) #si no simplemente regresa 1 else: return 1 def n_permutacion(n, lista): """obtiene la n-esima permutacion lexicografica de los elementos de una lista""" #creamos una funcion lambda para ir removiendo #los elementos que ya fijamos, por lo tanto los demas van cambiando remover = lambda lista, aremover: [i for i in lista if i != aremover] #cuando ya no hay elementos en la lista significa que los elementos #ya quedaron ordenados y terminamos, regresando [] (vacio) if not lista: return [] #obtenemos div (divisor) y mod (modulo de n (numero de permutacion) #entre la longitud de la lista - 1) div, mod = divmod(n, factorial(len(lista)-1)) #el primer elemento es igual al elemento que hay #en la posicion div de la lista elemento = lista[div] #concatenamos el elemento actual con todos lo demas elementos #que nos valla regresando esta funcion, hasta que regrese [] #notese que el modulo va disminuyendo y se va pasando como parametro return [elemento]+n_permutacion(mod, remover(lista, elemento))
Créditos: