Il est universellement reconnu qu'une liste de n distincts symboles a n! permutations. Cependant, quand les symboles ne sont pas distincts, le plus commun de la convention, en mathématiques et ailleurs, semble être pour compter uniquement les permutations distinctes. Ainsi, les permutations de la liste [1, 1, 2]
sont généralement considérés comme des[1, 1, 2], [1, 2, 1], [2, 1, 1]
. En effet, le code C++ suivant imprime précisément ces trois là:
int a[] = {1, 1, 2};
do {
cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
} while(next_permutation(a,a+3));
Sur l'autre main, Python itertools.permutations
semble impression de quelque chose d'autre:
import itertools
for a in itertools.permutations([1, 1, 2]):
print a
Cette affiche
(1, 1, 2)
(1, 2, 1)
(1, 1, 2)
(1, 2, 1)
(2, 1, 1)
(2, 1, 1)
En tant qu'utilisateur Artsiom Rudzenka souligné en réponse à une question, la documentation Python dit:
Les éléments sont traités comme unique fonction de leur position, et non sur leur valeur.
Ma question: pourquoi cette conception de décision?
Il semble qu'à la suite de la convention habituelle, donnerait des résultats qui sont plus utiles (et en effet, il est généralement exactement ce que je veux)... ou est-il une application de Python est un comportement que je suis absent?
[Ou est-ce un problème de mise en œuvre? L'algorithme que dans next_permutation
- par exemple expliqué sur StackOverflow ici (par moi) et illustré ici à O(1) amorti - semble efficace et applicable en Python, mais est Python faire quelque chose d'encore plus efficace car il ne garantit pas l'ordre lexicographique, fondée sur des valeurs? Et si oui, l'augmentation de l'efficacité considéré en vaut la peine?]