2017-10-19 14 views
0

Dans le code suivant, le seul élément qui est imprimé à partir de l'objet 'c' dans le produit en boucle est le premier, bien que 'c' et 'd' contiennent 3 éléments et les 3 éléments de 'd' sont itérés plus correctement.Python itertools.combinations début de coupure

from itertools import combinations 

c,d = combinations(map(str, range(3)),2), combinations(map(str, range(3)),2) 
for x in c: 
for y in d: 
    print(x,y) 

générateurs de transtypage à la liste permet de résoudre ce problème et imprime 9 lignes, mais pourquoi cela se produit en premier lieu?

Répondre

2

Le problème est que c et d sont tous les deux itérateurs, et après la première fois dans la boucle interne, d a été épuisé. La façon la plus simple de résoudre ce problème est de faire:

from itertools import combinations, product 

c = combinations(map(str, range(3)),2) 
d = combinations(map(str, range(3)),2) 

for x, y in product(c, d): 
    print(x,y) 

Ce produit:

('0', '1') ('0', '1') 
('0', '1') ('0', '2') 
('0', '1') ('1', '2') 
('0', '2') ('0', '1') 
('0', '2') ('0', '2') 
('0', '2') ('1', '2') 
('1', '2') ('0', '1') 
('1', '2') ('0', '2') 
('1', '2') ('1', '2') 
+0

Il était aussi simple que cela! et j'ai continué à penser qu'il y avait quelque chose de mal avec le premier générateur. +1 pour l'approche basée sur itertools.product. –