Locked learning resources

Join us and get access to thousands of tutorials and a community of expert Pythonistas.

Unlock This Lesson

Locked learning resources

This lesson is for members only. Join us and get access to thousands of tutorials and a community of expert Pythonistas.

Unlock This Lesson

itertools Module

In this lesson, you’ll learn about the itertools module. This module helps you create iterators for efficient looping:

>>> import itertools as it
>>> rep = it.repeat(1)
>>> next(rep)
>>> next(rep)

You’ll also learn about:

  • itertools.cycle, which infinitely cycles through iterables
  • itertools.permutations, which finds all the permutations (order matters)
  • itertools.combinations, which finds all the combinations (order does not matter)

You can check out the Python documentation on the itertools module.

00:00 In this video, you’ll learn about the itertools module, which contains a lot of useful functions that return iterators that help us loop through sequences efficiently.

00:09 Let’s start by importing the itertools module. I’m going to import itertools like this, and alias it as it just so I don’t have to type itertools over and over again.

00:19 Let’s start with itertools.repeat(). This is a useful function that takes in a number and returns an iterator that—when you call next() on it—will return this number. Let’s call this all_ones.

00:32 When you call next() on all_ones, it will print out 1 over and over and over again. If you were to call list() on all_ones, this will run forever because all_ones goes on infinitely.

00:44 Let’s see how you might use this. Let’s say we wanted to create a list of 0 through 10 and square each number. Instead of doing a list comprehension, you could use the built-in map() and then the built-in pow() function, pass in range(10), and then pass in our itertools.repeat(2) This will create a map object, and then list() under the hood will call the next() method on our map object, and then return a list of 0 through 10—not including 10—squared.

01:13 You could change this to 3, or 4, or something like this. It’s just a easy way to have a constant stream of numbers that you need to keep accessing over and over in some sort of list() or map().

01:25 You can also pass in a optional times argument, and that way, when you cast it to a list, it will actually stop because there is a finite number of 1’s.

01:34 There’s also another useful method, itertools.cycle(). It’ll take an iterable and return an iterator that will loop through the iterable infinite number of times. It does not take in an optional argument, so this will actually go forever. So, let’s do alternating_ones, which is the cycle of 1, -1. Calling next() on alternating_ones,

01:56 1, -1, 1, -1, 1, -1. So, sometimes in an interview, you need some sort of infinite sequence—either of a constant number, or have maybe a sequence of numbers that you need to keep repeating over and over until some condition happens.

02:09 This is a useful way to do it in one line. Let’s look at another function that is probably more useful in interviews: it.permutations(). So, this does exactly what you think it does.

02:20 It finds all the permutations of a specific length. I’m going to clear the output, just so it’s a little bit cleaner. Let’s say we have friends = ["Jack", "Jill", "Joe"].

02:32 You can do it.permutations() of friends

02:37 and then you pass in the length, 2so this will find all the permutations of length 2. permutations() does care about order, so ('Jack', 'Jill') and ('Jill', 'Jack') will appear twice.

02:47 This will return an iterator and then cast it to a list, and you get all the permutations. Length 3. Length 4 is nothing because there’s no permutation of length 4. You might

03:00 be thinking, “Okay, I don’t care about order, and I want ('Jack', 'Jill') and ('Jill', 'Jack') only to appear once.” it.combinations(), friends, grouping of 2. And grouping of 3.

03:11 You might want to ask your interviewer if it’s okay to use these built-in functions because sometimes they want you to implement it from scratch. There are many examples online how to do that, but sometimes it’s really useful to do this maybe in a coding challenge, or if your interviewer just wants you to get the permutations and wants you to do some more complex logic on them.

03:31 There are a ton more functions in the itertools module and I’ll link them all below. In the next video, you’ll learn about the functools module, which includes a lot of useful higher order functions and decorators such as the higher order function reduce() and the decorators lru_cache and cached_property.

Avatar image for James Uejio

James Uejio RP Team on April 27, 2020

Here is the Python documentation on the itertools module: Python itertools module

Avatar image for Pygator

Pygator on April 30, 2020

Lot’s of helpful hints/tips, but talking so fast does not help me learn it faster.

Avatar image for drawdoowmij

drawdoowmij on May 4, 2020

Hi James – Great video, at 1:10 you say “list calls the next method on a map object” can you let me know where in the documentation you found this. Thanks!

Avatar image for James Uejio

James Uejio RP Team on May 8, 2020

Hi @Pygator I will keep my speed in mind in the future, but for the current videos you can go to the gear icon and select 0.75x speed if it is too fast for you.

@drawdoowmij I can’t really find Python documentation on where this happens but I learned it in school here: www.youtube.com/watch?v=On-kFyFp8HY&list=PL6BsET-8jgYWPYsrAfTAN8rvBzk5cYfUZ&index=2. You can also see it answered here stackoverflow.com/questions/34732641/calling-list-empties-my-iterable-object. Plus you can see in the following example that list has to call next because it empties the iterator

>>> iterator = iter([1,2,3])
>>> next(iterator)
>>> list(iterator)
[2, 3]
>>> next(iterator)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Avatar image for drawdoowmij

drawdoowmij on May 8, 2020

Thanks for this information James!

Become a Member to join the conversation.