1============== 2More Itertools 3============== 4 5.. image:: https://coveralls.io/repos/github/erikrose/more-itertools/badge.svg?branch=master 6 :target: https://coveralls.io/github/erikrose/more-itertools?branch=master 7 8Python's ``itertools`` library is a gem - you can compose elegant solutions 9for a variety of problems with the functions it provides. In ``more-itertools`` 10we collect additional building blocks, recipes, and routines for working with 11Python iterables. 12 13---- 14 15+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 16| Grouping | `chunked <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.chunked>`_, | 17| | `sliced <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.sliced>`_, | 18| | `distribute <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.distribute>`_, | 19| | `divide <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.divide>`_, | 20| | `split_at <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.split_at>`_, | 21| | `split_before <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.split_before>`_, | 22| | `split_after <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.split_after>`_, | 23| | `bucket <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.bucket>`_, | 24| | `grouper <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.grouper>`_, | 25| | `partition <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.partition>`_ | 26+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 27| Lookahead and lookback | `spy <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.spy>`_, | 28| | `peekable <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.peekable>`_, | 29| | `seekable <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.seekable>`_ | 30+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 31| Windowing | `windowed <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.windowed>`_, | 32| | `stagger <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.stagger>`_, | 33| | `pairwise <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.pairwise>`_ | 34+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 35| Augmenting | `count_cycle <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.count_cycle>`_, | 36| | `intersperse <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.intersperse>`_, | 37| | `padded <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.padded>`_, | 38| | `adjacent <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.adjacent>`_, | 39| | `groupby_transform <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.groupby_transform>`_, | 40| | `padnone <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.padnone>`_, | 41| | `ncycles <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.ncycles>`_ | 42+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 43| Combining | `collapse <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.collapse>`_, | 44| | `sort_together <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.sort_together>`_, | 45| | `interleave <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.interleave>`_, | 46| | `interleave_longest <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.interleave_longest>`_, | 47| | `collate <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.collate>`_, | 48| | `zip_offset <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.zip_offset>`_, | 49| | `dotproduct <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.dotproduct>`_, | 50| | `flatten <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.flatten>`_, | 51| | `roundrobin <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.roundrobin>`_, | 52| | `prepend <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.prepend>`_ | 53+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 54| Summarizing | `ilen <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.ilen>`_, | 55| | `first <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first>`_, | 56| | `last <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.last>`_, | 57| | `one <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.one>`_, | 58| | `unique_to_each <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.unique_to_each>`_, | 59| | `locate <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.locate>`_, | 60| | `rlocate <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.rlocate>`_, | 61| | `consecutive_groups <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.consecutive_groups>`_, | 62| | `exactly_n <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.exactly_n>`_, | 63| | `run_length <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.run_length>`_, | 64| | `map_reduce <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.map_reduce>`_, | 65| | `all_equal <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.all_equal>`_, | 66| | `first_true <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first_true>`_, | 67| | `nth <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.nth>`_, | 68| | `quantify <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.quantify>`_ | 69+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 70| Selecting | `islice_extended <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.islice_extended>`_, | 71| | `strip <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.strip>`_, | 72| | `lstrip <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.lstrip>`_, | 73| | `rstrip <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.rstrip>`_, | 74| | `take <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.take>`_, | 75| | `tail <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.tail>`_, | 76| | `unique_everseen <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertoo ls.unique_everseen>`_, | 77| | `unique_justseen <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.unique_justseen>`_ | 78+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 79| Combinatorics | `distinct_permutations <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.distinct_permutations>`_, | 80| | `circular_shifts <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.circular_shifts>`_, | 81| | `powerset <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.powerset>`_, | 82| | `random_product <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.random_product>`_, | 83| | `random_permutation <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.random_permutation>`_, | 84| | `random_combination <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.random_combination>`_, | 85| | `random_combination_with_replacement <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.random_combination_with_replacement>`_, | 86| | `nth_combination <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.nth_combination>`_ | 87+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 88| Wrapping | `always_iterable <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_iterable>`_, | 89| | `consumer <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.consumer>`_, | 90| | `with_iter <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.with_iter>`_, | 91| | `iter_except <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.iter_except>`_ | 92+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 93| Others | `replace <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.replace>`_, | 94| | `numeric_range <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.numeric_range>`_, | 95| | `always_reversible <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_reversible>`_, | 96| | `side_effect <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.side_effect>`_, | 97| | `iterate <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.iterate>`_, | 98| | `difference <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.difference>`_, | 99| | `make_decorator <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.make_decorator>`_, | 100| | `SequenceView <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.SequenceView>`_, | 101| | `consume <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.consume>`_, | 102| | `accumulate <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.accumulate>`_, | 103| | `tabulate <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.tabulate>`_, | 104| | `repeatfunc <https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.repeatfunc>`_ | 105+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 106 107 108Getting started 109=============== 110 111To get started, install the library with `pip <https://pip.pypa.io/en/stable/>`_: 112 113.. code-block:: shell 114 115 pip install more-itertools 116 117The recipes from the `itertools docs <https://docs.python.org/3/library/itertools.html#itertools-recipes>`_ 118are included in the top-level package: 119 120.. code-block:: python 121 122 >>> from more_itertools import flatten 123 >>> iterable = [(0, 1), (2, 3)] 124 >>> list(flatten(iterable)) 125 [0, 1, 2, 3] 126 127Several new recipes are available as well: 128 129.. code-block:: python 130 131 >>> from more_itertools import chunked 132 >>> iterable = [0, 1, 2, 3, 4, 5, 6, 7, 8] 133 >>> list(chunked(iterable, 3)) 134 [[0, 1, 2], [3, 4, 5], [6, 7, 8]] 135 136 >>> from more_itertools import spy 137 >>> iterable = (x * x for x in range(1, 6)) 138 >>> head, iterable = spy(iterable, n=3) 139 >>> list(head) 140 [1, 4, 9] 141 >>> list(iterable) 142 [1, 4, 9, 16, 25] 143 144 145 146For the full listing of functions, see the `API documentation <https://more-itertools.readthedocs.io/en/latest/api.html>`_. 147 148Development 149=========== 150 151``more-itertools`` is maintained by `@erikrose <https://github.com/erikrose>`_ 152and `@bbayles <https://github.com/bbayles>`_, with help from `many others <https://github.com/erikrose/more-itertools/graphs/contributors>`_. 153If you have a problem or suggestion, please file a bug or pull request in this 154repository. Thanks for contributing! 155