python – Get the cartesian product of a series of lists?
python – Get the cartesian product of a series of lists?
itertools.product
Available from Python 2.6.
import itertools
somelists = [
[1, 2, 3],
[a, b],
[4, 5]
]
for element in itertools.product(*somelists):
print(element)
Which is the same as,
for element in itertools.product([1, 2, 3], [a, b], [4, 5]):
print(element)
import itertools
>>> for i in itertools.product([1,2,3],[a,b],[4,5]):
... print i
...
(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)
>>>
python – Get the cartesian product of a series of lists?
For Python 2.5 and older:
>>> [(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)]
Heres a recursive version of product()
(just an 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])
Example:
>>> 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())
[()]