title: 5 Useful Iterator Functions Notes from [this Indently video](https://www.youtube.com/watch?v=xYT9gsxy68w): ## batched ```py from itertools import batched numbers: list[int] = [1,2,3,4,5,6,7] my_batch: batched = batched(numbers,n=3) # don't actually convert to a list unless needed print(list(my_batch)) # [(1, 2, 3), (4, 5, 6), (7,)] batched_help == """ batched(iterable, n) Batch data into tuples of length n. The last batch may be shorter than n. """ ``` ## zip_longest ```py from itertools import zip_longest a = [ "a", "b", "c" ] x = [ "x", "y" ] u = [ "u", "v", "w", "t" ] print(list(zip(a,x,u))) # [('a', 'x', 'u'), ('b', 'y', 'v')] print(list(zip_longest(a,x,u))) # [('a', 'x', 'u'), ('b', 'y', 'v'), ('c', None, 'w'), (None, None, 't')] print(list(zip_longest(a,x,u,fillvalue="XYZ"))) # [('a', 'x', 'u'), ('b', 'y', 'v'), ('c', 'XYZ', 'w'), ('XYZ', 'XYZ', 't')] ``` ## product Cartesian product. ```py from itertools import product print(list(product(["a","b"],["c","d"]))) # [('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd')] print(["".join(x) for x in list(product(["a","b"],repeat=3))]) # ['aaa', 'aab', 'aba', 'abb', 'baa', 'bab', 'bba', 'bbb'] ``` ## starmap Saves doing a `lambda x: f(*x)` wrapper. ```py from itertools import starmap def get_sum(a:int, b:int, c:int) -> int: return sum((a,b,c)) data: list[tuple[int,int,int]] = [(1,2,3), (4,5,6)] sums: starmap = starmap(get_sum, data) # star as in * when passing args data: list[tuple[int,int]] = [(2,4), (3,3), (4,2)] sums: starmap = starmap(pow, data) ``` ## groupby ```py from itertools import groupby def count_vowels(text) -> int: # not an efficient way to do this return len([x for x in text if x.lower() in "aeiou"]) words: list[str] = ['cat', 'dog', 'mr', 'flibble', 'hex', 'vision'] sorted_words: list[str] = sorted(words, key=count_vowels) grouped: groupby = groupby(sorted_words, key=count_vowels) for vowels, grouped_words in grouped: print(vowels, list(grouped_words)) # 0 ['mr'] # 1 ['cat', 'dog', 'hex'] # 2 ['flibble'] # 3 ['vision'] ```