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:

http://pyeuler.wikidot.com/problems-21-30

Comments

Add comment
 authimage