Considérons la fonction suivante, dont la sortie est censé être le produit cartésien d'une séquence de iterables:Pourquoi ma fonction cartésienne ne fonctionne-t-elle pas?
def cart(*iterables):
out = ((e,) for e in iterables[0])
for iterable in iterables[1:]:
out = (e1 + (e2,) for e1 in out for e2 in iterable)
return out
fonctionne bien lorsque le générateur comprehensions sont remplacés par des list comprehensions. Fonctionne également quand il n'y a que 2 itérations. Mais quand j'essaie
print(list(cart([1, 2, 3], 'ab', [4, 5])))
Je reçois
[(1, 4, 4), (1, 4, 5), (1, 5, 4), (1, 5, 5),
(2, 4, 4), (2, 4, 5), (2, 5, 4), (2, 5, 5),
(3, 4, 4), (3, 4, 5), (3, 5, 4), (3, 5, 5)]
Pourquoi et non le produit cartésien?
Vous pouvez stocker des résultats intermédiaires en mémoire (comme l'approche par liste qui fonctionne) et ne pas différer leur évaluation avec cette génération. exp. dont les valeurs changent constamment à travers les itérations. –
Je sais que cette question concerne l'implémentation de l'algorithme pour le produit cartésien en Python, mais au cas où quelqu'un finirait par chercher comment faire un produit cartésien en Python, notez que ceci est déjà implémenté dans ['itertools.product'] (https://docs.python.org/3/library/itertools.html#itertools.product). – jdehesa