2010-09-14 4 views
11
test = ["a","b","c","d","e"] 

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

x = xuniqueCombinations(test, 3) 
print x 

sortiesComment imprimer ce que je pense être un objet?

"generator object xuniqueCombinations at 0x020EBFA8" 

Je veux voir toutes les combinaisons qu'il a trouvé. Comment puis je faire ça?

+2

deux choses: http://docs.python.org/library/itertools.html et http://docs.python.org/glossary.html#term-generator – SilentGhost

Répondre

16

leoluk est juste, vous devez itérer dessus. Mais voici la syntaxe correcte:

combos = xuniqueCombinations(test, 3) 
for x in combos: 
    print x 

Vous pouvez le convertir à une première liste:

combos = list(xuniqueCombinations(test, 3)) 
print combos 
4

Ceci est un objet générateur. Accès par itérer dessus:

for x in xuniqueCombinations: 
    print x 
+0

pour x dans xuniqueCombinations: TypeError: objet 'function' n'est pas itérable – Alex

+3

@Alex Vous devez appeler la fonction: 'pour x dans xuniqueCombinations (test, 3)'. Sinon, faites juste 'print list (xuniqueCombinations (test, 3))'. –

+2

-vous dire: pour x dans xuniqueCombinations (test, 3): – Alex

0
x = list(xuniqueCombinations(test, 3)) 
print x 

convertir votre générateur à la liste, et imprimer ......

+0

Ne pas comme cette réponse sans au moins un avertissement sur les implications de la mémoire. – Triptych

+0

ohh ok, mais si quelqu'un exécute une boucle sur un objet générateur pour l'imprimer sans le convertir en liste, il ne peut pas l'exécuter à nouveau sans appeler à nouveau cette fonction car l'itérateur sera épuisé .... – shahjapan

Questions connexes