#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