2009-09-06 10 views
3

Je suis en train de générer une liste de toutes les combinaisons possibles de nombre dans un ensemble de quatre numéros en utilisant tous les chiffres de 0 à 9.nombre maximum combinaisons

Je reçois près, mais la sortie ne montre pas tous les possibles combinaison commençant de 0000 à 9999.

Des indices sur la raison pour laquelle le code suivant supprime certaines combinaisons?

 
def permgen(items, n): 
    if n==0: yield [] 
    else: 
     for i in range(len(items)): 
      for cc in permgen(items[:i]+items[i+1:],n-1): 
       yield [items[i]]+cc 

if __name__=="__main__": 
    for c in permgen(['0','1','2','3','4','5','6','7','8','9'],4): print ''.join(c) 
+1

Un numéro peut-il apparaître plusieurs fois? 1234 est-il une combinaison différente de 1243? –

+0

Oui, ce serait deux combinaisons distinctes. –

Répondre

4

Cette ligne:

for cc in permgen(items[:i]+items[i+1:],n-1): 

Vous dites essentiellement « obtenir un numéro, que d'ajouter un autre différent de ir, répétition n fois, puis revenir une liste de ces chiffres qui vont vous donner des chiffres où aucun chiffre n'apparaît plus d'une fois.Si vous changez cette ligne à:

for cc in permgen(items,n-1): 

alors vous obtenez toutes les combinaisons.

12

Si vous avez python 2.6, pourquoi ne pas utiliser itertools.combinations?

from itertools import combinations 
combinations(range(10), 4) 
+0

Merci, je pourrais faire beaucoup avec ceci. –

0
int ra; 
for(ra=0,ra<10000;ra++) printf("%04u\n",ra); 
+3

Le compilateur Python aura certainement une journée sur le terrain avec ce code ... ;-) –

4

Jetez un oeil à itertools' combinatoric generators:

>>> from itertools import combinations, permutations, product 
>>> def pp(chunks): 
...  print(' '.join(map(''.join, chunks))) 
... 
>>> pp(combinations('012', 2)) 
01 02 12 
>>> pp(permutations('012', 2)) 
01 02 10 12 20 21 
>>> pp(product('012', repeat=2)) 
00 01 02 10 11 12 20 21 22 
>>> from itertools import combinations_with_replacement 
>>> pp(combinations_with_replacement('012', 2)) 
00 01 02 11 12 22 

combinations_with_replacement est disponible en Python 3.1 (ou 2.7). Il semble que itertools.product est le plus approprié pour votre tâche.

+0

Ne savait pas à ce sujet. Ça a l'air génial. –