There are lots of great Python libraries, but most of them dont come close to what built-in itertools and also more-itertools provide. These two libraries are really the whole kitchen sink when it comes to processing/iterating over some data in Python. At first glance however, functions in those libraries might not seem that useful, so lets make little tour of (in my opinion) the most interesting ones, including examples how to get the most out of them! Compress Before we get to functions from more_itertools library, lets first look into few of the more obscure ones from built-in itertools module - first of them being itertools.compress: dates = [ 2020-01-01, 2020-02-04, 2020-02-01, 2020-01-24, 2020-01-08, 2020-02-10, 2020-02-15, 2020-02-11, ] counts = [1, 4, 3, 8, 0, 7, 9, 2] from itertools import compress bools = [n > 3 for n in counts] print(list(compress(dates, bools))) # Compress returns iterator! # [2020-02-04, 2020-01-24, 2020-02-10, 2020-02-15] You have quite a few option when it comes to filtering sequences, one of them is also compress, which takes iterable and boolean selector and outputs items of the iterable where the corresponding element in the selector is True. We can use this to apply result of filtering of one sequence to another like in above example, where we create list of dates where the corresponding count is greater than 3. Accumulate As name suggests - we will use this function to accumulate results of some (binary) function. Example of this can be running maximum or factorial: from itertools import accumulate import operator data = [3, 4, 1, 3, 5, 6, 9, 0, 1] list(accumulate(data, max)) # running maximum # [3, 4, 4, 4, 5, 6, 9, 9, 9] list(accumulate(range(1, 11), operator.mul)) # Factorial # [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800] If you dont care about intermediate results, you could use functools.reduce (called fold in other languages), which keeps only final value and is also more memory efficient. Cycle This function takes iterable and creates infinite cycle from it. This can be useful for example in a game, where players take turns. Another cool thing you can do with cycle is to create simple infinite spinner: # Cycling through players from itertools import cycle players = [John, Ben, Martin, Peter] next_player = cycle(players).__next__ player = next_player() # John player = next_player() # Ben # ... # Infinite Spinner import time for c in cycle(/-\|): print(c, end = \r) time.sleep(0.2) One thing you might need to do when using cycle is skipping few elements of iterable (in other words - starting at different element). You can do that with itertools.islice, so to start at third player from example above you could do: islice(cycle(players), 2, None). Tee Final one from itertools module is tee, this function creates multiple iterators from one, which allows us to remember what happened. Example of that is pairwise function from itertools recipes (and also more_itertools), which returns pairs of values from input iterable (current value and previous one): from itertools import tee def pairwise(iterable): s -> (s0, s1), (s1, s2), (s2, s3), ... a, b = tee(iterable, 2) next(b, None)