How to get the Cartesian product of multiple lists
cartesian-product, list, python
Solution
Use `itertools.product`, which has been available since Python 2.6.
import itertools
somelists = [
[1, 2, 3],
['a', 'b'],
[4, 5]
]
for element in itertools.product(*somelists):
print(element)
This is the same as:
for element in itertools.product([1, 2, 3], ['a', 'b'], [4, 5]):
print(element)
Problem
How can I get the Cartesian product (every possible combination of values) from a group of lists? For example, given ``` somelists = [ [1, 2, 3], ['a', 'b'], [4, 5] ] ``` How do I get this? ``` [(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4), (2, 'a', 5), ...] ``` One common application for this technique is to avoid deeply nested loops. See Avoiding nested for loops for a more specific duplicate. Similarly, this technique might be used to "explode" a dictionary with list values; see Combine Python Dictionary Permutations into List of Dictionaries . If you want a Cartesian product of the same list with itself multiple times, `itertools.product` can handle that elegantly. See Operation on every pair of element in a list or How can I get "permutations with repetitions" from a list (Cartesian product of a list with itself)?. Many people who already know about `itertools.product` struggle with the fact that it expects separate arguments for each input sequence, rather than e.g. a list of lists. The accepted answer shows how to handle this with `*`. However, the use of `*` here to unpack arguments is fundamentally not different from any other time it's used in a function call. Please see Expanding tuples into arguments for this topic (and use that instead to close duplicate questions, as appropriate).
Related problems
- Avoiding nested for loops
- Using NumPy to build an array of all combinations of two arrays
- How can I make a list of dictionaries according to the Cartesian product of values in a source dictionary ("explode" the dictionary)?
- Expanding tuples into arguments
- How can I get "permutations with repetitions/replacement" from a list (Cartesian product of a list with itself)?
- Operation on every pair of element in a list