.. automodule:: more_itertools
- Major chances:
- Python 2.7 is no longer supported. The 5.0.0 release will be the last version targeting Python 2.7.
- All future releases will target the active versions of Python 3. As of 2019, those are Python 3.4 and above.
- The
six
library is no longer a dependency. - The :func:`accumulate` function is no longer part of this library. You
may import a better version from the standard
itertools
module.
- Changes to existing itertools:
- The order of the parameters in :func:`grouper` have changed to match
the latest recipe in the itertools documentation. Use of the old order
will be supported in this release, but emit a
DeprecationWarning
. The legacy behavior will be dropped in a future release. (thanks to jaraco) - :func:`distinct_permutations` was improved (thanks to jferard - see also permutations with unique values at StackOverflow.)
- An unused parameter was removed from :func:`substrings`. (thanks to pylang)
- The order of the parameters in :func:`grouper` have changed to match
the latest recipe in the itertools documentation. Use of the old order
will be supported in this release, but emit a
- Other changes:
- The docs for :func:`unique_everseen` were improved. (thanks to jferard and MSeifert04)
- Several Python 2-isms were removed. (thanks to jaraco, MSeifert04, and hugovk)
- New itertools:
- :func:`split_into` (thanks to rovyko)
- :func:`unzip` (thanks to bmintz)
- :func:`substrings` (thanks to pylang)
- Changes to existing itertools:
- :func:`ilen` was optimized a bit (thanks to MSeifert04, achampion, and bmintz)
- :func:`first_true` now returns
None
by default. This is the reason for the major version bump - see below. (thanks to sk and OJFord)
- Other changes:
- Some code for old Python versions was removed (thanks to hugovk)
- Some documentation mistakes were corrected (thanks to belm0 and hugovk)
- Tests now run properly on 32-bit versions of Python (thanks to Millak)
- Newer versions of CPython and PyPy are now tested against
The major version update is due to the change in the default return value of
:func:`first_true`. It's now None
.
>>> from more_itertools import first_true
>>> iterable = [0, '', False, [], ()] # All these are False
>>> answer = first_true(iterable)
>>> print(answer)
None
- New itertools:
- :func:`last` (thanks to tmshn)
- :func:`replace` (thanks to pylang)
- :func:`rlocate` (thanks to jferard and pylang)
- Improvements to existing itertools:
- :func:`locate` can now search for multiple items
- Other changes:
- The docs now include a nice table of tools (thanks MSeifert04)
- New itertools:
- :func:`map_reduce` (thanks to pylang)
- :func:`prepend` (from the Python 3.7 docs)
- Improvements to existing itertools:
- :func:`bucket` now complies with PEP 479 (thanks to irmen)
- Other changes:
- Python 3.7 is now supported (thanks to irmen)
- Python 3.3 is no longer supported
- The test suite no longer requires third-party modules to run
- The API docs now include links to source code
- New itertools:
- :func:`split_at` (thanks to michael-celani)
- :func:`circular_shifts` (thanks to hiqua)
- :func:`make_decorator` - see the blog post Yo, I heard you like decorators for a tour (thanks to pylang)
- :func:`always_reversible` (thanks to michael-celani)
- :func:`nth_combination` (from the Python 3.7 docs)
- Improvements to existing itertools:
- :func:`seekable` now has an
elements
method to return cached items. - The performance tradeoffs between :func:`roundrobin` and :func:`interleave_longest` are now documented (thanks michael-celani, pylang, and MSeifert04)
- :func:`seekable` now has an
- No code changes - this release fixes how the docs display on PyPI.
- New itertools:
- :func:`consecutive_groups` (Based on the example in the Python 2.4 docs)
- :func:`seekable` (If you're looking for how to "reset" an iterator, you're in luck!)
- :func:`exactly_n` (thanks to michael-celani)
- :func:`run_length.encode` and :func:`run_length.decode`
- :func:`difference`
- Improvements to existing itertools:
- The number of items between filler elements in :func:`intersperse` can now be specified (thanks to pylang)
- :func:`distinct_permutations` and :func:`peekable` got some minor adjustments (thanks to MSeifert04)
- :func:`always_iterable` now returns an iterator object. It also now allows different types to be considered iterable (thanks to jaraco)
- :func:`bucket` can now limit the keys it stores in memory
- :func:`one` now allows for custom exceptions (thanks to kalekundert)
- Other changes:
- A few typos were fixed (thanks to EdwardBetts)
- All tests can now be run with
python setup.py test
The major version update is due to the change in the return value of :func:`always_iterable`. It now always returns iterator objects:
>>> from more_itertools import always_iterable
# Non-iterable objects are wrapped with iter(tuple(obj))
>>> always_iterable(12345)
<tuple_iterator object at 0x7fb24c9488d0>
>>> list(always_iterable(12345))
[12345]
# Iterable objects are wrapped with iter()
>>> always_iterable([1, 2, 3, 4, 5])
<list_iterator object at 0x7fb24c948c50>
- New itertools:
- :func:`lstrip`, :func:`rstrip`, and :func:`strip` (thanks to MSeifert04 and pylang)
- :func:`islice_extended`
- Improvements to existing itertools:
- Some bugs with slicing :func:`peekable`-wrapped iterables were fixed
- New itertools:
- :func:`numeric_range` (Thanks to BebeSparkelSparkel and MSeifert04)
- :func:`count_cycle` (Thanks to BebeSparkelSparkel)
- :func:`locate` (Thanks to pylang and MSeifert04)
- Improvements to existing itertools:
- A few itertools are now slightly faster due to some function optimizations. (Thanks to MSeifert04)
- The docs have been substantially revised with installation notes, categories for library functions, links, and more. (Thanks to pylang)
- Removed itertools:
context
has been removed due to a design flaw - see below for replacement options. (thanks to NeilGirdhar)
- Improvements to existing itertools:
side_effect
now supportsbefore
andafter
keyword arguments. (Thanks to yardsale8)
- PyPy and PyPy3 are now supported.
The major version change is due to the removal of the context
function.
Replace it with standard with
statement context management:
# Don't use context() anymore
file_obj = StringIO()
consume(print(x, file=f) for f in context(file_obj) for x in u'123')
# Use a with statement instead
file_obj = StringIO()
with file_obj as f:
consume(print(x, file=f) for x in u'123')
- New itertools:
adjacent
andgroupby_transform
(Thanks to diazona)always_iterable
(Thanks to jaraco)- (Removed in 3.0.0)
context
(Thanks to yardsale8) divide
(Thanks to mozbhearsum)
- Improvements to existing itertools:
ilen
is now slightly faster. (Thanks to wbolster)peekable
can now prepend items to an iterable. (Thanks to diazona)
- New itertools:
distribute
(Thanks to mozbhearsum and coady)sort_together
(Thanks to clintval)stagger
andzip_offset
(Thanks to joshbode)padded
- Improvements to existing itertools:
peekable
now handles negative indexes and slices with negative components properly.intersperse
is now slightly faster. (Thanks to pylang)windowed
now accepts astep
keyword argument. (Thanks to pylang)
- Python 3.6 is now supported.
- Move docs 100% to readthedocs.io.
- New itertools:
accumulate
,all_equal
,first_true
,partition
, andtail
from the itertools documentation.bucket
(Thanks to Rosuav and cvrebert)collapse
(Thanks to abarnet)interleave
andinterleave_longest
(Thanks to abarnet)side_effect
(Thanks to nvie)sliced
(Thanks to j4mie and coady)split_before
andsplit_after
(Thanks to astronouth7303)spy
(Thanks to themiurgo and mathieulongtin)
- Improvements to existing itertools:
chunked
is now simpler and more friendly to garbage collection. (Contributed by coady, with thanks to piskvorky)collate
now delegates toheapq.merge
when possible. (Thanks to kmike and julianpistorius)peekable
-wrapped iterables are now indexable and sliceable. Iterating throughpeekable
-wrapped iterables is also faster.one
andunique_to_each
have been simplified. (Thanks to coady)
- Added
one
fromjaraco.util.itertools
. (Thanks, jaraco!) - Added
distinct_permutations
andunique_to_each
. (Contributed by bbayles) - Added
windowed
. (Contributed by bbayles, with thanks to buchanae, jaraco, and abarnert) - Simplified the implementation of
chunked
. (Thanks, nvie!) - Python 3.5 is now supported. Python 2.6 is no longer supported.
- Python 3 is now supported directly; there is no 2to3 step.
- Added
iterate
andwith_iter
. (Thanks, abarnert!)
- Added (tested!) implementations of the recipes from the itertools documentation. (Thanks, Chris Lonnen!)
- Added
ilen
. (Thanks for the inspiration, Matt Basta!)
chunked
now returns lists rather than tuples. After all, they're homogeneous. This slightly backward-incompatible change is the reason for the major version bump.- Added
@consumer
. - Improved test machinery.
- Added
first
function. - Added Python 3 support.
- Added a default arg to
peekable.peek()
. - Noted how to easily test whether a peekable iterator is exhausted.
- Rewrote documentation.
- Initial release, with
collate
,peekable
, andchunked
. Could really use better docs.