In this tutorial, you’ll learn how to use Python to get all combinations of a list. In particular, you’ll learn how to how to use the itertool.combinations
method to generate a list of all combinations of values in a list.
The Quick Answer: Use itertools.combinations to Get All Combinations of a List
Table of Contents
What Does it Mean to Get All Combinations of a List?
In your Python journey, you may encounter the need to get all combinations of the items in a list. But what does this mean?
Let’s say you have a list that looks like this: ['a', 'b', 'c']
.
When you create a list of all possible combinations, you’ll end up with a list that looks like this: [(), ('a',), ('b',), ('c',), ('a', 'b'), ('a', 'c'), ('b', 'c'), ('a', 'b', 'c')]
. Here we get a list of tuples that contain all possible combinations without replacement.
Now that you know what it means to get a list of all possible combinations of a list in Python, let’s see how you can get this done in Python!
How to Use Itertools to Get All Combinations of a List in Python
Python comes built-in with a helpful library called itertools
, that provides helpful functions to work with iteratable objects. One of the many functions it comes with it the combinations()
function. This, as the name implies, provides ways to generate combinations of lists.
Let’s take a look at how the combinations()
function works:
itertools.combinations(iterable, r)
iterable
refers to the iterable for which you want to find combinations,r
refers to the length of the combinations you want to produce
Now that you know how the combinations()
function works, let’s see how we can generate all possible combinations of a Python list’s items:
from itertools import combinations
sample_list = ['a', 'b', 'c']
list_combinations = list()
for n in range(len(sample_list) + 1):
list_combinations += list(combinations(sample_list, n))
print(list_combinations)
# Returns: [(), ('a',), ('b',), ('c',), ('a', 'b'), ('a', 'c'), ('b', 'c'), ('a', 'b', 'c')]
Let’s break down what we’ve done here:
- We import the
combinations
function fromitertools
- We create a sample list and an empty list to store our data in
- We then create a for-loop to loop over all possible combinations of lengths. To make this dynamic, we use the
range()
function, since we may not know how long our list is at any given time. - We then create a list out of the combinations object that’s returned from passing in our sample list and our
n
parameter
We can see that our list includes a blank combination as well. If we wanted to omit this, we could change our for-loop to be from range(1, len(sample_list)+1)
, in order to have a minimum number of elements in our combination.
In the next section, you’ll learn how to get all combinations of only unique values in a list.
Want to learn more about Python for-loops? Check out my in-depth tutorial here to learn all you need to know!
How to Get All Combinations of Unique Values of a List in Python
In this section, you’ll learn how to get all combinations of only unique values of a list in Python. Since Python lists can contain duplicate values, we’ll need to figure out how to do this.
Say we have a list that looks like this: ['a', 'b', 'c', 'c']
. Instead of including duplicate combinations of c
in our final list, we’ll first need to remove duplicates from our list.
Let’s see how we can do this in Python:
from itertools import combinations
sample_list = ['a', 'b', 'c', 'c']
list_combinations = list()
sample_set = set(sample_list)
for n in range(len(sample_set) + 1):
list_combinations += list(combinations(sample_set, n))
print(list_combinations)
This follows the same logic as the example above. The only difference is that we have first created a set out of our list. Sets are a unique data structure in Python that require each item to be unique. Therefore, it’s a helpful way to de-duplicate our list.
We then iterate over the length of the set and the set itself, to create all possible combinations.
How to Get All Combinations with Replacement of a List in Python
In this final section, you’ll learn how to get all combinations of a list in Python with replacements. Meaning, that a single element has the potential for being picked again.
Let’s see how this can be done in Python, using itertools
and the combinations_with_replacement
function. The function does exactly what it is described as: it gets the combinates with replacements.
from itertools import combinations_with_replacement
sample_list = ['a', 'b', 'c']
list_combinations = list()
for n in range(len(sample_list) + 1):
list_combinations += list(combinations_with_replacement(sample_list, n))
print(list_combinations)
# Returns: [(), ('a',), ('b',), ('c',), ('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c'), ('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'a', 'c'), ('a', 'b', 'b'), ('a', 'b', 'c'), ('a', 'c', 'c'), ('b', 'b', 'b'), ('b', 'b', 'c'), ('b', 'c', 'c'), ('c', 'c', 'c')]
We can see here that each item has the potential for being included once, twice, or three times in a list of three items.
Conclusion
In this post, you learned how to get all combinations of a list in Python. You learned how to do this with the itertools.combinations
function and the `itertools.combinations_with_replacement_ function. The functions allow you to pass in a list and get the combinations without and with replacements, respectively.
To learn more about the itertools.combinations
function, check out the official documentation here.
Hi,
Is there a method in itertools to return the nCr # of combinations of a list? I want to take a list of 0s and 1s, and I want to return the list of unique combinations. So, given [1,1,0,0] I want to return:
1,1,0,0
1,0,1,0
1,0,0,1
0,1,1,0
0,1,0,1
0,0,1,1
Thanks
Hi Jeff,
How’s this:
from itertools import permutations
values = [1, 1, 0, 0]
# Generate all permutations considering the counts
combinations_list = list(set(permutations(values)))
print(combinations_list)
# Returns: [(0, 1, 0, 1), (1, 1, 0, 0), (0, 1, 1, 0), (1, 0, 1, 0), (1, 0, 0, 1), (0, 0, 1, 1)]
What if I wanted it to only generate combinations a certain number long?
Hi Carl, sorry for the late reply! How about this?
import itertools
values = [1, 2, 3, 4, 5]
m = 3. # The number of items you want in each combination
# Generate all combinations of m items from the list
combinations = list(itertools.combinations(values, m))