Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/05/2012, à 15:40

netsabes

Python : fonctionnalité de itertools.permutations

Bonjour,

je souhaite parcourir toutes les permutations d'un ensemble à n éléments, où n est un carré (16,25,36, etc...)
Sous sa forme actuelle, il me semble que list(itertools.permutations(liste)) fournit une liste de permutations, que l'on peut parcourir, mais qui occupe une place démesurée en mémoire, la saturant rapidement (déjà 16 élément, ça coince).

J'aurais voulu un index, du genre list(itertools.permutations(liste,k)) où l'on puisse donner à k n'importe quelle valeur de 0 à factorielle(nombre d'éléments de la liste) - 1. Cette fonction donnerait directement la permutation "n°k" de la liste. Cela doit bien être possible, puisque l'outil fournit une liste ordonnée.

Qu'en pensez-vous ?

Merci.


Cet Univers ne serait pas grand-chose s’il n’abritait pas les gens qu’on aime. (Stephen Hawking)
Linux Ubuntu 22.04 Gnome (64 bits)

Hors ligne

#2 Le 16/05/2012, à 22:18

Keldath

Re : Python : fonctionnalité de itertools.permutations

Bonsoir,

"itertools.permutations(seq)" ne renvoie pas de liste indexée comme tu as pu le constater, mais un iterateur qui retourne chaque élément un par un, notamment pour éviter de garder en mémoire l'ensemble des éléments (ce qui se produit en enrobant l'iterateur avec "list()", on se retrouve vite à swapper).

Pour arriver à ta fin, tu peux écrire une fonction comme celle-ci :

import itertools

def permutations(elts, index_list=[]):
    r = itertools.permutations(elts)
    i = 0
    for p in r:
        if i in index_list:
            yield p
        i += 1

Que tu utilises ainsi :

>>> list(permutations([1, 2, 3, 4], index_list=[2, 4, 6]))
[(1, 3, 2, 4), (1, 4, 2, 3), (2, 1, 3, 4)]

Je n'ai pas regardé en détail la doc Python, peut-être existe t-il déjà une fonction similaire.

Hors ligne