Pour Python 2.5 et plus :
>>> [(a, b, c) for a in [1,2,3] for b in ['a','b'] for c in [4,5]]
[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4),
(2, 'a', 5), (2, 'b', 4), (2, 'b', 5), (3, 'a', 4), (3, 'a', 5),
(3, 'b', 4), (3, 'b', 5)]
Voici une version récursive de product()
(juste une illustration) :
def product(*args):
if not args:
return iter(((),)) # yield tuple()
return (items + (item,)
for items in product(*args[:-1]) for item in args[-1])
Exemple :
>>> list(product([1,2,3], ['a','b'], [4,5]))
[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4),
(2, 'a', 5), (2, 'b', 4), (2, 'b', 5), (3, 'a', 4), (3, 'a', 5),
(3, 'b', 4), (3, 'b', 5)]
>>> list(product([1,2,3]))
[(1,), (2,), (3,)]
>>> list(product([]))
[]
>>> list(product())
[()]
39 votes
Sachez que "toutes les combinaisons possibles" n'est pas tout à fait la même chose que "produit cartésien", puisque dans les produits cartésiens, les doublons sont autorisés.
10 votes
Existe-t-il une version non dupliquée du produit cartésien ?
23 votes
@KJW Oui,
set(cartesian product)
14 votes
Il ne devrait pas y avoir de doublons dans un produit cartésien, sauf si les listes d'entrée contiennent elles-mêmes des doublons. Si vous ne voulez pas de doublons dans le produit cartésien, utilisez la commande
set(inputlist)
sur toutes vos listes d'entrée. Pas sur le résultat.3 votes
@Triptych quoi ? La définition standard d'un produit cartésien est un ensemble. Pourquoi tant de gens votent en haut ?
9 votes
Mathématiquement, un produit cartésien est un ensemble, donc un produit cartésien ne pas contiennent des doublons. D'autre part,
itertools.product
aura des doublons dans la sortie si les entrées ont des doublons. Doncitertools.product
n'est pas à proprement parler le produit cartésien, à moins que vous n'enveloppiez les entrées dans duset
comme mentionné par @CamilB.0 votes
@Pascalv la définition standard d'une combinaison est un élément (non ordonné) d'un produit plusieurs fois cartésien d'un ensemble avec lui-même, tel que le élément ne contient aucun doublon. Un produit cartésien d'ensembles ne contient pas de doublons, mais les éléments de ce produit peuvent en contenir. Pour compliquer le problème, mathématiquement parlant
itertools.product
est un produit cartésien de multisets. Un produit de multi-ensembles contient des tuples en double si les multi-ensembles d'entrée en contiennent. Toutes ces questions sont en jeu dans les commentaires ici, et les gens parlent peut-être les uns des autres.