Hello community,
here is the log from the commit of package python-more-itertools for
openSUSE:Factory checked in at 2020-01-24 13:06:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-more-itertools (Old)
and /work/SRC/openSUSE:Factory/.python-more-itertools.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-more-itertools"
Fri Jan 24 13:06:35 2020 rev:8 rq:766375 version:8.1.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-more-itertools/python-more-itertools.changes
2020-01-01 14:58:26.205935440 +0100
+++
/work/SRC/openSUSE:Factory/.python-more-itertools.new.26092/python-more-itertools.changes
2020-01-24 13:09:52.989402235 +0100
@@ -1,0 +2,13 @@
+Wed Jan 22 15:56:53 UTC 2020 - Martin Sirringhaus <[email protected]>
+
+- update to 8.1.0:
+ * Bug fixes
+ :func:`partition` works with pred=None again. (thanks
+ to MSeifert04)
+ * New itertools
+ :func:`sample` (thanks to tommyod)
+ :func:`nth_or_last` (thanks to d-ryzhikov)
+ * Changes to existing itertools:
+ The implementation for :func:`divide` was improved.
+
+-------------------------------------------------------------------
Old:
----
more-itertools-8.0.2.tar.gz
New:
----
more-itertools-8.1.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-more-itertools.spec ++++++
--- /var/tmp/diff_new_pack.HZHEyl/_old 2020-01-24 13:09:53.905402602 +0100
+++ /var/tmp/diff_new_pack.HZHEyl/_new 2020-01-24 13:09:53.905402602 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-more-itertools
#
-# Copyright (c) 2019 SUSE LLC
+# Copyright (c) 2020 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -19,7 +19,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
%define skip_python2 1
Name: python-more-itertools
-Version: 8.0.2
+Version: 8.1.0
Release: 0
Summary: More routines for operating on iterables, beyond itertools
License: MIT
++++++ more-itertools-8.0.2.tar.gz -> more-itertools-8.1.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.0.2/PKG-INFO
new/more-itertools-8.1.0/PKG-INFO
--- old/more-itertools-8.0.2/PKG-INFO 2019-12-06 13:17:53.696788300 +0100
+++ new/more-itertools-8.1.0/PKG-INFO 2020-01-11 19:59:22.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.2
Name: more-itertools
-Version: 8.0.2
+Version: 8.1.0
Summary: More routines for operating on iterables, beyond itertools
Home-page: https://github.com/erikrose/more-itertools
Author: Erik Rose
@@ -59,7 +59,6 @@
| | `sort_together
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.sort_together>`_,
|
| | `interleave
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.interleave>`_,
|
| | `interleave_longest
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.interleave_longest>`_,
|
- | | `collate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.collate>`_,
|
| | `zip_offset
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.zip_offset>`_,
|
| | `dotproduct
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.dotproduct>`_,
|
| | `flatten
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.flatten>`_,
|
@@ -67,32 +66,32 @@
| | `prepend
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.prepend>`_
|
+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Summarizing | `ilen
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.ilen>`_,
|
- | | `first
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first>`_,
|
- | | `last
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.last>`_,
|
- | | `one
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.one>`_,
|
- | | `only
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.only>`_,
|
| | `unique_to_each
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.unique_to_each>`_,
|
- | | `locate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.locate>`_,
|
- | | `rlocate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.rlocate>`_,
|
+ | | `sample
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.sample>`_,
|
| | `consecutive_groups
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.consecutive_groups>`_,
|
- | | `exactly_n
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.exactly_n>`_,
|
| | `run_length
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.run_length>`_,
|
| | `map_reduce
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.map_reduce>`_,
|
+ | | `exactly_n
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.exactly_n>`_,
|
| | `all_equal
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.all_equal>`_,
|
| | `first_true
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first_true>`_,
|
- | | `nth
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.nth>`_,
|
| | `quantify
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.quantify>`_
|
+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Selecting | `islice_extended
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.islice_extended>`_,
|
+ | | `first
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first>`_,
|
+ | | `last
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.last>`_,
|
+ | | `one
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.one>`_,
|
+ | | `only
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.only>`_,
|
| | `strip
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.strip>`_,
|
| | `lstrip
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.lstrip>`_,
|
| | `rstrip
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.rstrip>`_,
|
+ | | `filter_except
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.filter_except>`_
|
+ | | `map_except
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.map_except>`_
|
+ | | `nth_or_last
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.nth_or_last>`_,
|
+ | | `nth
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.nth>`_,
|
| | `take
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.take>`_,
|
| | `tail
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.tail>`_,
|
| | `unique_everseen
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertoo
ls.unique_everseen>`_,
|
| | `unique_justseen
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.unique_justseen>`_
|
- | | `filter_except
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.filter_except>`_
|
- | | `map_except
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.map_except>`_
|
+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Combinatorics | `distinct_permutations
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.distinct_permutations>`_,
|
| | `distinct_combinations
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.distinct_combinations>`_,
|
@@ -107,13 +106,15 @@
| | `nth_combination
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.nth_combination>`_
|
+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Wrapping | `always_iterable
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_iterable>`_,
|
+ | | `always_reversible
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_reversible>`_,
|
| | `consumer
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.consumer>`_,
|
| | `with_iter
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.with_iter>`_,
|
| | `iter_except
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.iter_except>`_
|
+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
- | Others | `replace
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.replace>`_,
|
+ | Others | `locate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.locate>`_,
|
+ | | `rlocate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.rlocate>`_,
|
+ | | `replace
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.replace>`_,
|
| | `numeric_range
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.numeric_range>`_,
|
- | | `always_reversible
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_reversible>`_,
|
| | `side_effect
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.side_effect>`_,
|
| | `iterate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.iterate>`_,
|
| | `difference
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.difference>`_,
|
@@ -181,6 +182,19 @@
:noindex:
+ 8.1.0
+ -----
+
+ * Bug fixes
+ * partition works with ``pred=None`` again. (thanks to MSeifert04)
+
+ * New itertools
+ * sample (thanks to tommyod)
+ * nth_or_last (thanks to d-ryzhikov)
+
+ * Changes to existing itertools:
+ * The implementation for divide was improved. (thanks to jferard)
+
8.0.2
-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.0.2/README.rst
new/more-itertools-8.1.0/README.rst
--- old/more-itertools-8.0.2/README.rst 2019-11-29 20:07:06.000000000 +0100
+++ new/more-itertools-8.1.0/README.rst 2020-01-11 19:59:09.000000000 +0100
@@ -51,7 +51,6 @@
| | `sort_together
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.sort_together>`_,
|
| | `interleave
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.interleave>`_,
|
| | `interleave_longest
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.interleave_longest>`_,
|
-| | `collate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.collate>`_,
|
| | `zip_offset
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.zip_offset>`_,
|
| | `dotproduct
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.dotproduct>`_,
|
| | `flatten
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.flatten>`_,
|
@@ -59,32 +58,32 @@
| | `prepend
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.prepend>`_
|
+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Summarizing | `ilen
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.ilen>`_,
|
-| | `first
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first>`_,
|
-| | `last
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.last>`_,
|
-| | `one
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.one>`_,
|
-| | `only
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.only>`_,
|
| | `unique_to_each
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.unique_to_each>`_,
|
-| | `locate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.locate>`_,
|
-| | `rlocate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.rlocate>`_,
|
+| | `sample
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.sample>`_,
|
| | `consecutive_groups
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.consecutive_groups>`_,
|
-| | `exactly_n
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.exactly_n>`_,
|
| | `run_length
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.run_length>`_,
|
| | `map_reduce
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.map_reduce>`_,
|
+| | `exactly_n
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.exactly_n>`_,
|
| | `all_equal
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.all_equal>`_,
|
| | `first_true
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first_true>`_,
|
-| | `nth
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.nth>`_,
|
| | `quantify
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.quantify>`_
|
+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Selecting | `islice_extended
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.islice_extended>`_,
|
+| | `first
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first>`_,
|
+| | `last
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.last>`_,
|
+| | `one
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.one>`_,
|
+| | `only
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.only>`_,
|
| | `strip
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.strip>`_,
|
| | `lstrip
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.lstrip>`_,
|
| | `rstrip
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.rstrip>`_,
|
+| | `filter_except
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.filter_except>`_
|
+| | `map_except
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.map_except>`_
|
+| | `nth_or_last
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.nth_or_last>`_,
|
+| | `nth
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.nth>`_,
|
| | `take
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.take>`_,
|
| | `tail
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.tail>`_,
|
| | `unique_everseen
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertoo
ls.unique_everseen>`_,
|
| | `unique_justseen
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.unique_justseen>`_
|
-| | `filter_except
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.filter_except>`_
|
-| | `map_except
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.map_except>`_
|
+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Combinatorics | `distinct_permutations
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.distinct_permutations>`_,
|
| | `distinct_combinations
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.distinct_combinations>`_,
|
@@ -99,13 +98,15 @@
| | `nth_combination
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.nth_combination>`_
|
+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Wrapping | `always_iterable
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_iterable>`_,
|
+| | `always_reversible
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_reversible>`_,
|
| | `consumer
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.consumer>`_,
|
| | `with_iter
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.with_iter>`_,
|
| | `iter_except
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.iter_except>`_
|
+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Others | `replace
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.replace>`_,
|
+| Others | `locate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.locate>`_,
|
+| | `rlocate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.rlocate>`_,
|
+| | `replace
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.replace>`_,
|
| | `numeric_range
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.numeric_range>`_,
|
-| | `always_reversible
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_reversible>`_,
|
| | `side_effect
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.side_effect>`_,
|
| | `iterate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.iterate>`_,
|
| | `difference
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.difference>`_,
|
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.0.2/docs/api.rst
new/more-itertools-8.1.0/docs/api.rst
--- old/more-itertools-8.0.2/docs/api.rst 2019-12-01 20:26:05.000000000
+0100
+++ new/more-itertools-8.1.0/docs/api.rst 2020-01-11 19:59:09.000000000
+0100
@@ -129,17 +129,12 @@
**New itertools**
.. autofunction:: ilen
-.. autofunction:: first(iterable[, default])
-.. autofunction:: last(iterable[, default])
-.. autofunction:: one(iterable, too_short=ValueError, too_long=ValueError)
-.. autofunction:: only(iterable, default=None, too_long=ValueError)
.. autofunction:: unique_to_each
-.. autofunction:: locate(iterable, pred=bool, window_size=None)
-.. autofunction:: rlocate(iterable, pred=bool, window_size=None)
+.. autofunction:: sample(iterable, k=1, weights=None)
.. autofunction:: consecutive_groups(iterable, ordering=lambda x: x)
-.. autofunction:: exactly_n(iterable, n, predicate=bool)
.. autoclass:: run_length
.. autofunction:: map_reduce
+.. autofunction:: exactly_n(iterable, n, predicate=bool)
----
@@ -147,7 +142,6 @@
.. autofunction:: all_equal
.. autofunction:: first_true
-.. autofunction:: nth
.. autofunction:: quantify(iterable, pred=bool)
@@ -161,16 +155,22 @@
**New itertools**
.. autofunction:: islice_extended(start, stop, step)
+.. autofunction:: first(iterable[, default])
+.. autofunction:: last(iterable[, default])
+.. autofunction:: one(iterable, too_short=ValueError, too_long=ValueError)
+.. autofunction:: only(iterable, default=None, too_long=ValueError)
.. autofunction:: strip
.. autofunction:: lstrip
.. autofunction:: rstrip
.. autofunction:: filter_except
.. autofunction:: map_except
+.. autofunction:: nth_or_last(iterable, n[, default])
----
**Itertools recipes**
+.. autofunction:: nth
.. autofunction:: take
.. autofunction:: tail
.. autofunction:: unique_everseen
@@ -215,6 +215,7 @@
**New itertools**
.. autofunction:: always_iterable
+.. autofunction:: always_reversible
.. autofunction:: consumer
.. autofunction:: with_iter
@@ -230,9 +231,10 @@
**New itertools**
+.. autofunction:: locate(iterable, pred=bool, window_size=None)
+.. autofunction:: rlocate(iterable, pred=bool, window_size=None)
.. autofunction:: replace
.. autofunction:: numeric_range(start, stop, step)
-.. autofunction:: always_reversible
.. autofunction:: side_effect
.. autofunction:: iterate
.. autofunction:: difference(iterable, func=operator.sub, *, initial=None)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.0.2/docs/conf.py
new/more-itertools-8.1.0/docs/conf.py
--- old/more-itertools-8.0.2/docs/conf.py 2019-12-06 13:17:40.000000000
+0100
+++ new/more-itertools-8.1.0/docs/conf.py 2020-01-11 19:59:09.000000000
+0100
@@ -14,6 +14,8 @@
import sphinx_rtd_theme
+import more_itertools
+
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
@@ -49,7 +51,7 @@
# built documents.
#
# The short X.Y version.
-version = '8.0.2'
+version = more_itertools.__version__
# The full version, including alpha/beta/rc tags.
release = version
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.0.2/docs/versions.rst
new/more-itertools-8.1.0/docs/versions.rst
--- old/more-itertools-8.0.2/docs/versions.rst 2019-12-06 13:17:17.000000000
+0100
+++ new/more-itertools-8.1.0/docs/versions.rst 2020-01-11 19:59:09.000000000
+0100
@@ -5,6 +5,19 @@
.. automodule:: more_itertools
:noindex:
+8.1.0
+-----
+
+* Bug fixes
+ * :func:`partition` works with ``pred=None`` again. (thanks to MSeifert04)
+
+* New itertools
+ * :func:`sample` (thanks to tommyod)
+ * :func:`nth_or_last` (thanks to d-ryzhikov)
+
+* Changes to existing itertools:
+ * The implementation for :func:`divide` was improved. (thanks to jferard)
+
8.0.2
-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.0.2/more_itertools/__init__.py
new/more-itertools-8.1.0/more_itertools/__init__.py
--- old/more-itertools-8.0.2/more_itertools/__init__.py 2019-12-06
03:05:54.000000000 +0100
+++ new/more-itertools-8.1.0/more_itertools/__init__.py 2020-01-11
19:59:09.000000000 +0100
@@ -1,2 +1,4 @@
from .more import * # noqa
from .recipes import * # noqa
+
+__version__ = '8.1.0'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.0.2/more_itertools/more.py
new/more-itertools-8.1.0/more_itertools/more.py
--- old/more-itertools-8.0.2/more_itertools/more.py 2019-12-06
03:05:47.000000000 +0100
+++ new/more-itertools-8.1.0/more_itertools/more.py 2020-01-11
19:59:09.000000000 +0100
@@ -1,9 +1,8 @@
import warnings
-
from collections import Counter, defaultdict, deque
from collections.abc import Sequence
from functools import partial, wraps
-from heapq import merge
+from heapq import merge, heapify, heapreplace, heappop
from itertools import (
chain,
compress,
@@ -18,7 +17,9 @@
tee,
zip_longest,
)
-from operator import itemgetter, lt, gt, sub
+from math import exp, floor, log
+from operator import gt, itemgetter, lt, sub
+from random import random, randrange, uniform
from sys import maxsize
from time import monotonic
@@ -58,6 +59,7 @@
'make_decorator',
'map_except',
'map_reduce',
+ 'nth_or_last',
'numeric_range',
'one',
'only',
@@ -70,6 +72,7 @@
'rlocate',
'rstrip',
'run_length',
+ 'sample',
'seekable',
'SequenceView',
'side_effect',
@@ -180,6 +183,23 @@
return default
+def nth_or_last(iterable, n, default=_marker):
+ """Return the nth or the last item of *iterable*,
+ or *default* if *iterable* is empty.
+
+ >>> nth_or_last([0, 1, 2, 3], 2)
+ 2
+ >>> nth_or_last([0, 1], 2)
+ 1
+ >>> nth_or_last([], 0, 'some default')
+ 'some default'
+
+ If *default* is not provided and there are no items in the iterable,
+ raise ``ValueError``.
+ """
+ return last(islice(iterable, n + 1), default=default)
+
+
class peekable:
"""Wrap an iterator to allow lookahead and prepending elements.
@@ -1441,13 +1461,20 @@
if n < 1:
raise ValueError('n must be at least 1')
- seq = tuple(iterable)
+ try:
+ iterable[:0]
+ except TypeError:
+ seq = tuple(iterable)
+ else:
+ seq = iterable
+
q, r = divmod(len(seq), n)
ret = []
- for i in range(n):
- start = (i * q) + (i if i < r else r)
- stop = ((i + 1) * q) + (i + 1 if i + 1 < r else r)
+ stop = 0
+ for i in range(1, n + 1):
+ start = stop
+ stop += q + 1 if i <= r else q
ret.append(iter(seq[start:stop]))
return ret
@@ -2689,3 +2716,100 @@
yield function(item)
except exceptions:
pass
+
+
+def _sample_unweighted(iterable, k):
+ # Implementation of "Algorithm L" from the 1994 paper by Kim-Hung Li:
+ # "Reservoir-Sampling Algorithms of Time Complexity O(n(1+log(N/n)))".
+
+ # Fill up the reservoir (collection of samples) with the first `k` samples
+ reservoir = take(k, iterable)
+
+ # Generate random number that's the largest in a sample of k U(0,1) numbers
+ # Largest order statistic: https://en.wikipedia.org/wiki/Order_statistic
+ W = exp(log(random()) / k)
+
+ # The number of elements to skip before changing the reservoir is a random
+ # number with a geometric distribution. Sample it using random() and logs.
+ next_index = k + floor(log(random()) / log(1 - W))
+
+ for index, element in enumerate(iterable, k):
+
+ if index == next_index:
+ reservoir[randrange(k)] = element
+ # The new W is the largest in a sample of k U(0, `old_W`) numbers
+ W *= exp(log(random()) / k)
+ next_index += floor(log(random()) / log(1 - W)) + 1
+
+ return reservoir
+
+
+def _sample_weighted(iterable, k, weights):
+ # Implementation of "A-ExpJ" from the 2006 paper by Efraimidis et al. :
+ # "Weighted random sampling with a reservoir".
+
+ # Log-transform for numerical stability for weights that are small/large
+ weight_keys = (log(random()) / weight for weight in weights)
+
+ # Fill up the reservoir (collection of samples) with the first `k`
+ # weight-keys and elements, then heapify the list.
+ reservoir = take(k, zip(weight_keys, iterable))
+ heapify(reservoir)
+
+ # The number of jumps before changing the reservoir is a random variable
+ # with an exponential distribution. Sample it using random() and logs.
+ smallest_weight_key, _ = reservoir[0]
+ weights_to_skip = log(random()) / smallest_weight_key
+
+ for weight, element in zip(weights, iterable):
+ if weight >= weights_to_skip:
+ # The notation here is consistent with the paper, but we store
+ # the weight-keys in log-space for better numerical stability.
+ smallest_weight_key, _ = reservoir[0]
+ t_w = exp(weight * smallest_weight_key)
+ r_2 = uniform(t_w, 1) # generate U(t_w, 1)
+ weight_key = log(r_2) / weight
+ heapreplace(reservoir, (weight_key, element))
+ smallest_weight_key, _ = reservoir[0]
+ weights_to_skip = log(random()) / smallest_weight_key
+ else:
+ weights_to_skip -= weight
+
+ # Equivalent to [element for weight_key, element in sorted(reservoir)]
+ return [heappop(reservoir)[1] for _ in range(k)]
+
+
+def sample(iterable, k, weights=None):
+ """Return a *k*-length list of elements chosen (without replacement)
+ from the *iterable*. Like :func:`random.sample`, but works on iterables
+ of unknown length.
+
+ >>> iterable = range(100)
+ >>> sample(iterable, 5) # doctest: +SKIP
+ [81, 60, 96, 16, 4]
+
+ An iterable with *weights* may also be given:
+
+ >>> iterable = range(100)
+ >>> weights = (i * i + 1 for i in range(100))
+ >>> sampled = sample(iterable, 5, weights=weights) # doctest: +SKIP
+ [79, 67, 74, 66, 78]
+
+ The algorithm can also be used to generate weighted random permutations.
+ The relative weight of each item determines the probability that it
+ appears late in the permutation.
+
+ >>> data = "abcdefgh"
+ >>> weights = range(1, len(data) + 1)
+ >>> sample(data, k=len(data), weights=weights) # doctest: +SKIP
+ ['c', 'a', 'b', 'e', 'g', 'd', 'h', 'f']
+ """
+ if k == 0:
+ return []
+
+ iterable = iter(iterable)
+ if weights is None:
+ return _sample_unweighted(iterable, k)
+ else:
+ weights = iter(weights)
+ return _sample_weighted(iterable, k, weights)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.0.2/more_itertools/recipes.py
new/more-itertools-8.1.0/more_itertools/recipes.py
--- old/more-itertools-8.0.2/more_itertools/recipes.py 2019-12-01
04:46:19.000000000 +0100
+++ new/more-itertools-8.1.0/more_itertools/recipes.py 2020-01-04
02:33:10.000000000 +0100
@@ -313,8 +313,17 @@
>>> list(even_items), list(odd_items)
([0, 2, 4, 6, 8], [1, 3, 5, 7, 9])
+ If *pred* is None, :func:`bool` is used.
+
+ >>> iterable = [0, 1, False, True, '', ' ']
+ >>> false_items, true_items = partition(None, iterable)
+ >>> list(false_items), list(true_items)
+ ([0, False, ''], [1, True, ' '])
+
"""
- # partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9
+ if pred is None:
+ pred = bool
+
evaluations = ((pred(x), x) for x in iterable)
t1, t2 = tee(evaluations)
return (
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/more-itertools-8.0.2/more_itertools.egg-info/PKG-INFO
new/more-itertools-8.1.0/more_itertools.egg-info/PKG-INFO
--- old/more-itertools-8.0.2/more_itertools.egg-info/PKG-INFO 2019-12-06
13:17:53.000000000 +0100
+++ new/more-itertools-8.1.0/more_itertools.egg-info/PKG-INFO 2020-01-11
19:59:22.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.2
Name: more-itertools
-Version: 8.0.2
+Version: 8.1.0
Summary: More routines for operating on iterables, beyond itertools
Home-page: https://github.com/erikrose/more-itertools
Author: Erik Rose
@@ -59,7 +59,6 @@
| | `sort_together
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.sort_together>`_,
|
| | `interleave
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.interleave>`_,
|
| | `interleave_longest
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.interleave_longest>`_,
|
- | | `collate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.collate>`_,
|
| | `zip_offset
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.zip_offset>`_,
|
| | `dotproduct
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.dotproduct>`_,
|
| | `flatten
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.flatten>`_,
|
@@ -67,32 +66,32 @@
| | `prepend
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.prepend>`_
|
+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Summarizing | `ilen
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.ilen>`_,
|
- | | `first
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first>`_,
|
- | | `last
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.last>`_,
|
- | | `one
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.one>`_,
|
- | | `only
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.only>`_,
|
| | `unique_to_each
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.unique_to_each>`_,
|
- | | `locate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.locate>`_,
|
- | | `rlocate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.rlocate>`_,
|
+ | | `sample
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.sample>`_,
|
| | `consecutive_groups
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.consecutive_groups>`_,
|
- | | `exactly_n
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.exactly_n>`_,
|
| | `run_length
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.run_length>`_,
|
| | `map_reduce
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.map_reduce>`_,
|
+ | | `exactly_n
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.exactly_n>`_,
|
| | `all_equal
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.all_equal>`_,
|
| | `first_true
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first_true>`_,
|
- | | `nth
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.nth>`_,
|
| | `quantify
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.quantify>`_
|
+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Selecting | `islice_extended
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.islice_extended>`_,
|
+ | | `first
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.first>`_,
|
+ | | `last
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.last>`_,
|
+ | | `one
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.one>`_,
|
+ | | `only
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.only>`_,
|
| | `strip
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.strip>`_,
|
| | `lstrip
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.lstrip>`_,
|
| | `rstrip
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.rstrip>`_,
|
+ | | `filter_except
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.filter_except>`_
|
+ | | `map_except
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.map_except>`_
|
+ | | `nth_or_last
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.nth_or_last>`_,
|
+ | | `nth
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.nth>`_,
|
| | `take
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.take>`_,
|
| | `tail
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.tail>`_,
|
| | `unique_everseen
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertoo
ls.unique_everseen>`_,
|
| | `unique_justseen
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.unique_justseen>`_
|
- | | `filter_except
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.filter_except>`_
|
- | | `map_except
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.map_except>`_
|
+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Combinatorics | `distinct_permutations
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.distinct_permutations>`_,
|
| | `distinct_combinations
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.distinct_combinations>`_,
|
@@ -107,13 +106,15 @@
| | `nth_combination
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.nth_combination>`_
|
+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Wrapping | `always_iterable
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_iterable>`_,
|
+ | | `always_reversible
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_reversible>`_,
|
| | `consumer
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.consumer>`_,
|
| | `with_iter
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.with_iter>`_,
|
| | `iter_except
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.iter_except>`_
|
+------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
- | Others | `replace
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.replace>`_,
|
+ | Others | `locate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.locate>`_,
|
+ | | `rlocate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.rlocate>`_,
|
+ | | `replace
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.replace>`_,
|
| | `numeric_range
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.numeric_range>`_,
|
- | | `always_reversible
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_reversible>`_,
|
| | `side_effect
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.side_effect>`_,
|
| | `iterate
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.iterate>`_,
|
| | `difference
<https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.difference>`_,
|
@@ -181,6 +182,19 @@
:noindex:
+ 8.1.0
+ -----
+
+ * Bug fixes
+ * partition works with ``pred=None`` again. (thanks to MSeifert04)
+
+ * New itertools
+ * sample (thanks to tommyod)
+ * nth_or_last (thanks to d-ryzhikov)
+
+ * Changes to existing itertools:
+ * The implementation for divide was improved. (thanks to jferard)
+
8.0.2
-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.0.2/setup.cfg
new/more-itertools-8.1.0/setup.cfg
--- old/more-itertools-8.0.2/setup.cfg 2019-12-06 13:17:53.696788300 +0100
+++ new/more-itertools-8.1.0/setup.cfg 2020-01-11 19:59:22.000000000 +0100
@@ -1,3 +1,9 @@
+[bumpversion]
+current_version = 8.1.0
+commit = True
+tag = False
+files = more_itertools/__init__.py
+
[flake8]
exclude = ./docs/conf.py, .eggs/
ignore = E203, E731, E741, F999, W503
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.0.2/setup.py
new/more-itertools-8.1.0/setup.py
--- old/more-itertools-8.0.2/setup.py 2019-12-06 13:17:35.000000000 +0100
+++ new/more-itertools-8.1.0/setup.py 2020-01-11 19:59:09.000000000 +0100
@@ -2,6 +2,8 @@
from setuptools import setup
+from more_itertools import __version__
+
def get_long_description():
# Fix display issues on PyPI caused by RST markup
@@ -22,7 +24,7 @@
setup(
name='more-itertools',
- version='8.0.2',
+ version=__version__,
description='More routines for operating on iterables, beyond itertools',
long_description=get_long_description(),
author='Erik Rose',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.0.2/tests/test_more.py
new/more-itertools-8.1.0/tests/test_more.py
--- old/more-itertools-8.0.2/tests/test_more.py 2019-12-06 03:05:47.000000000
+0100
+++ new/more-itertools-8.1.0/tests/test_more.py 2020-01-11 19:59:09.000000000
+0100
@@ -19,6 +19,8 @@
repeat,
)
from operator import add, mul, itemgetter
+from random import seed
+from statistics import mean
from sys import version_info
from time import sleep
from unittest import skipIf, TestCase
@@ -200,6 +202,21 @@
self.assertEqual(mi.last(IterOnlyRange(5)), 4)
+class NthOrLastTests(TestCase):
+ """Tests for ``nth_or_last()``"""
+
+ def test_basic(self):
+ self.assertEqual(mi.nth_or_last(range(3), 1), 1)
+ self.assertEqual(mi.nth_or_last(range(3), 3), 2)
+
+ def test_default_value(self):
+ default = 42
+ self.assertEqual(mi.nth_or_last(range(0), 3, default), default)
+
+ def test_empty_iterable_no_default(self):
+ self.assertRaises(ValueError, lambda: mi.nth_or_last(range(0), 0))
+
+
class PeekableTests(TestCase):
"""Tests for ``peekable()`` behavor not incidentally covered by testing
``collate()``
@@ -1670,9 +1687,8 @@
)
def test_large_n(self):
- iterable = [1, 2, 3, 4]
self.assertEqual(
- [list(x) for x in mi.divide(6, iterable)],
+ [list(x) for x in mi.divide(6, iter(range(1, 4 + 1)))],
[[1], [2], [3], [4], [], []],
)
@@ -2936,3 +2952,89 @@
actual = list(mi.map_except(int, iterable, ValueError, TypeError))
expected = [0, 1, 2, 4]
self.assertEqual(actual, expected)
+
+
+class SampleTests(TestCase):
+
+ def test_unit_case(self):
+ """Test against a fixed case by seeding the random module."""
+ # Beware that this test really just verifies random.random() behavior.
+ # If the algorithm is changed (e.g. to a more naive implementation)
+ # this test will fail, but the algorithm might be correct.
+ # Also, this test can pass and the algorithm can be completely wrong.
+ data = "abcdef"
+ weights = list(range(1, len(data) + 1))
+ seed(123)
+ actual = mi.sample(data, k=2, weights=weights)
+ expected = ['f', 'e']
+ self.assertEqual(actual, expected)
+
+ def test_length(self):
+ """Check that *k* elements are sampled."""
+ data = [1, 2, 3, 4, 5]
+ for k in [0, 3, 5, 7]:
+ sampled = mi.sample(data, k=k)
+ actual = len(sampled)
+ expected = min(k, len(data))
+ self.assertEqual(actual, expected)
+
+ def test_samling_entire_iterable(self):
+ """If k=len(iterable), the sample contains the original elements."""
+ data = ["a", 2, "a", 4, (1, 2, 3)]
+ actual = set(mi.sample(data, k=len(data)))
+ expected = set(data)
+ self.assertEqual(actual, expected)
+
+ def test_scale_invariance_of_weights(self):
+ """The probabilit of chosing element a_i is w_i / sum(weights).
+ Scaling weights should not change the probability or outcome."""
+ data = "abcdef"
+
+ weights = list(range(1, len(data) + 1))
+ seed(123)
+ first_sample = mi.sample(data, k=2, weights=weights)
+
+ # Scale the weights and sample again
+ weights_scaled = [w / 1e10 for w in weights]
+ seed(123)
+ second_sample = mi.sample(data, k=2, weights=weights_scaled)
+
+ self.assertEqual(first_sample, second_sample)
+
+ def test_invariance_under_permutations_unweighted(self):
+ """The order of the data should not matter. This is a stochastic test,
+ but it will fail in less than 1 / 10_000 cases."""
+
+ # Create a data set and a reversed data set
+ data = list(range(100))
+ data_rev = list(reversed(data))
+
+ # Sample each data set 10 times
+ data_means = [mean(mi.sample(data, k=50)) for _ in range(10)]
+ data_rev_means = [mean(mi.sample(data_rev, k=50)) for _ in range(10)]
+
+ # The difference in the means should be low, i.e. little bias
+ difference_in_means = abs(mean(data_means) - mean(data_rev_means))
+
+ # The observed largest difference in 10,000 simulations was 5.09599
+ self.assertTrue(difference_in_means < 5.1)
+
+ def test_invariance_under_permutations_weighted(self):
+ """The order of the data should not matter. This is a stochastic test,
+ but it will fail in less than 1 / 10_000 cases."""
+
+ # Create a data set and a reversed data set
+ data = list(range(1, 101))
+ data_rev = list(reversed(data))
+
+ # Sample each data set 10 times
+ data_means = [mean(mi.sample(data, k=50, weights=data))
+ for _ in range(10)]
+ data_rev_means = [mean(mi.sample(data_rev, k=50, weights=data_rev))
+ for _ in range(10)]
+
+ # The difference in the means should be low, i.e. little bias
+ difference_in_means = abs(mean(data_means) - mean(data_rev_means))
+
+ # The observed largest difference in 10,000 simulations was 4.337999
+ self.assertTrue(difference_in_means < 4.4)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/more-itertools-8.0.2/tests/test_recipes.py
new/more-itertools-8.1.0/tests/test_recipes.py
--- old/more-itertools-8.0.2/tests/test_recipes.py 2019-12-01
04:46:19.000000000 +0100
+++ new/more-itertools-8.1.0/tests/test_recipes.py 2020-01-04
02:33:10.000000000 +0100
@@ -319,17 +319,20 @@
"""Tests for ``partition()``"""
def test_bool(self):
- """Test when pred() returns a boolean"""
lesser, greater = mi.partition(lambda x: x > 5, range(10))
self.assertEqual(list(lesser), [0, 1, 2, 3, 4, 5])
self.assertEqual(list(greater), [6, 7, 8, 9])
def test_arbitrary(self):
- """Test when pred() returns an integer"""
divisibles, remainders = mi.partition(lambda x: x % 3, range(10))
self.assertEqual(list(divisibles), [0, 3, 6, 9])
self.assertEqual(list(remainders), [1, 2, 4, 5, 7, 8])
+ def test_pred_is_none(self):
+ falses, trues = mi.partition(None, range(3))
+ self.assertEqual(list(falses), [0])
+ self.assertEqual(list(trues), [1, 2])
+
class PowersetTests(TestCase):
"""Tests for ``powerset()``"""