Imprime permutações específicas de uma lista em Python

Sep 28 2020

Para todas as permutações de uma lista, desejo imprimir apenas aquelas em que o valor em um índice específico é maior do que os valores nos índices anteriores. Esse índice seria chamado de "ótimo índice", por exemplo: se a lista for [1,2,3], suas permutações são

(1, 3, 2)
(2, 1, 3)
(2, 3, 1)
(3, 1, 2)
(3, 2, 1)

Gostaria de imprimir apenas as permutações em que existam apenas n "grandes índices". Digamos n = 2, então a saída seria:

[1,3,2],[2,1,3] and [2,3,1]

Em [1,3,2], os índices 0 e 1 são ótimos índices porque 1 (no índice 0) não possui nenhum elemento anterior e 3 (no índice 1) é maior que seu elemento anterior, ou seja, 1. 2 (no índice 2) não é um "ótimo índice "porque não é maior que seu elemento anterior 3. Da mesma forma, In [2,1,3], os índices 0 e 2 são ótimos índices. Em [2,3,1], os índices 0 e 1 são ótimos índices. Estou usando a biblioteca de permutações em Python para gerar as permutações. Uma solução simples e fácil de entender seria apreciada.

Respostas

1 IoaTzimas Sep 27 2020 at 23:38

Isso deve funcionar:

import itertools
def great(l, n): #function that counts the permutations of list l with n great indices
    def count_of_great(k): #function that counts the great indices of list k
        c=1 #because first element is always great
        for i in range(1,len(k)):
            if k[i]>max(k[:i]): #if the value is greater than all previous values we increase c
                c+=1
        return c #this is the count of great indices in k
    return [p for p in itertools.permutations(l) if count_of_great(p)==n] #this is a list of permutations of l that have a count_of_great eual with n

great([1,2,3], 2)

Resultado:

[(1, 3, 2), (2, 1, 3), (2, 3, 1)]