2017-08-08 2 views
2

Si j'ai:combinaisons -Tous python de la longueur donnée d'un tableau

a=[[1,2,3],['a','b'],[7,8,9],['c','d','e']] 

Je sais que je devrais utiliser:

for t in itertools.product(*a): 
    print t 

pour obtenir toutes les combinaisons telles que

[(1,'a',7,'c'),(1,'a',7,'d')....] 

Cependant, si je veux définir une sous-séquence d'éléments, que dois-je faire? Par exemple, le résultat que je veux est (si je mets 3 en longueur):

[(1,'a',7),(1,'a','c')....] 

qui sont toutes les combinaisons de longueur 3.

Répondre

3

Vous pouvez le faire en utilisant une boucle externe pour obtenir toutes les combinaisons de 3 sous-listes en a, puis une boucle interne pour générer les produits cartésiens de ces sous-listes:

import itertools 

a = [[1, 2, 3], ['a', 'b'], [7, 8, 9], ['c', 'd', 'e']] 

for groups in itertools.combinations(a, 3): 
    for t in itertools.product(*groups): 
     print(t) 

sortie

(1, 'a', 7) 
(1, 'a', 8) 
(1, 'a', 9) 
(1, 'b', 7) 
(1, 'b', 8) 
(1, 'b', 9) 
(2, 'a', 7) 
(2, 'a', 8) 
(2, 'a', 9) 
(2, 'b', 7) 
(2, 'b', 8) 
(2, 'b', 9) 
(3, 'a', 7) 
(3, 'a', 8) 
(3, 'a', 9) 
(3, 'b', 7) 
(3, 'b', 8) 
(3, 'b', 9) 
(1, 'a', 'c') 
(1, 'a', 'd') 
(1, 'a', 'e') 
(1, 'b', 'c') 
(1, 'b', 'd') 
(1, 'b', 'e') 
(2, 'a', 'c') 
(2, 'a', 'd') 
(2, 'a', 'e') 
(2, 'b', 'c') 
(2, 'b', 'd') 
(2, 'b', 'e') 
(3, 'a', 'c') 
(3, 'a', 'd') 
(3, 'a', 'e') 
(3, 'b', 'c') 
(3, 'b', 'd') 
(3, 'b', 'e') 
(1, 7, 'c') 
(1, 7, 'd') 
(1, 7, 'e') 
(1, 8, 'c') 
(1, 8, 'd') 
(1, 8, 'e') 
(1, 9, 'c') 
(1, 9, 'd') 
(1, 9, 'e') 
(2, 7, 'c') 
(2, 7, 'd') 
(2, 7, 'e') 
(2, 8, 'c') 
(2, 8, 'd') 
(2, 8, 'e') 
(2, 9, 'c') 
(2, 9, 'd') 
(2, 9, 'e') 
(3, 7, 'c') 
(3, 7, 'd') 
(3, 7, 'e') 
(3, 8, 'c') 
(3, 8, 'd') 
(3, 8, 'e') 
(3, 9, 'c') 
(3, 9, 'd') 
(3, 9, 'e') 
('a', 7, 'c') 
('a', 7, 'd') 
('a', 7, 'e') 
('a', 8, 'c') 
('a', 8, 'd') 
('a', 8, 'e') 
('a', 9, 'c') 
('a', 9, 'd') 
('a', 9, 'e') 
('b', 7, 'c') 
('b', 7, 'd') 
('b', 7, 'e') 
('b', 8, 'c') 
('b', 8, 'd') 
('b', 8, 'e') 
('b', 9, 'c') 
('b', 9, 'd') 
('b', 9, 'e') 
1

Remplacer

for t in itertools.product(*a): 

Avec

for t in itertools.product(*a, repeat=3): 

Et jetez un oeil à the docs pour plus de détails

+1

Il me donne 3 répétais toute la longueur d'une combinaison telle que: [(1, 'a', 7, 'c', 1, 'a', 7, 'c', 1, 'a' , 7, 'c'), ....] – dPdms

+1

il ne fait pas ce qui est mentionné dans la question –

+0

@dPdms excuses, je vais modifier la réponse –