Imprimer des permutations spécifiques d'une liste en Python

Sep 28 2020

Pour toutes les permutations d'une liste, je souhaite imprimer uniquement les permutations dans lesquelles la valeur à un index particulier est supérieure aux valeurs des index précédents. Un tel index serait appelé un "grand index" ex: si la liste est [1,2,3], ses permutations sont

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

Je voudrais imprimer uniquement de telles permutations dans lesquelles il n'y a que n "grands indices". Disons n = 2, alors la sortie serait:

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

Dans [1,3,2], les indices 0 et 1 sont de bons indices car 1 (à l'index 0) n'a aucun élément précédent et 3 (à l'index 1) est supérieur à son élément précédent, c'est-à-dire 1. 2 (à l'index 2) n'est pas un "grand index "car il n'est pas supérieur à son élément précédent 3. De même, In [2,1,3], les indices 0 et 2 sont de grands indices. En [2,3,1], les indices 0 et 1 sont d'excellents indices. J'utilise la bibliothèque de permutations en Python pour générer les permutations. Une solution simple et facile à comprendre serait appréciée.

Réponses

1 IoaTzimas Sep 27 2020 at 23:38

Cela devrait fonctionner:

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)

Production:

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