summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2010-08-07 21:55:06 (GMT)
committerRaymond Hettinger <python@rcn.com>2010-08-07 21:55:06 (GMT)
commit47ed1c10e7580c49b7d4a5b0cbbafcaf5c5239e1 (patch)
tree7c245eb23bf8443433ef9559fa70e91b85600a09
parent2866933cd63dd32ba2a0ce7f888d765265636b41 (diff)
downloadcpython-47ed1c10e7580c49b7d4a5b0cbbafcaf5c5239e1.zip
cpython-47ed1c10e7580c49b7d4a5b0cbbafcaf5c5239e1.tar.gz
cpython-47ed1c10e7580c49b7d4a5b0cbbafcaf5c5239e1.tar.bz2
Backport doc updates for the bisect module
-rw-r--r--Doc/library/bisect.rst81
1 files changed, 60 insertions, 21 deletions
diff --git a/Doc/library/bisect.rst b/Doc/library/bisect.rst
index eb32354..930b3fd 100644
--- a/Doc/library/bisect.rst
+++ b/Doc/library/bisect.rst
@@ -14,6 +14,8 @@ approach. The module is called :mod:`bisect` because it uses a basic bisection
algorithm to do its work. The source code may be most useful as a working
example of the algorithm (the boundary conditions are already right!).
+.. versionadded:: 2.1
+
The following functions are provided:
@@ -26,21 +28,13 @@ The following functions are provided:
existing entries. The return value is suitable for use as the first parameter
to ``list.insert()``. This assumes that *list* is already sorted.
- .. versionadded:: 2.1
-
.. function:: bisect_right(list, item[, lo[, hi]])
+.. function:: bisect(list, item[, lo[, hi]])
Similar to :func:`bisect_left`, but returns an insertion point which comes after
(to the right of) any existing entries of *item* in *list*.
- .. versionadded:: 2.1
-
-
-.. function:: bisect(...)
-
- Alias for :func:`bisect_right`.
-
.. function:: insort_left(list, item[, lo[, hi]])
@@ -48,24 +42,62 @@ The following functions are provided:
``list.insert(bisect.bisect_left(list, item, lo, hi), item)``. This assumes
that *list* is already sorted.
- .. versionadded:: 2.1
-
+ Also note that while the fast search step is O(log n), the slower insertion
+ step is O(n), so the overall operation is slow.
.. function:: insort_right(list, item[, lo[, hi]])
+ insort(a, x, lo=0, hi=len(a))
Similar to :func:`insort_left`, but inserting *item* in *list* after any
existing entries of *item*.
- .. versionadded:: 2.1
-
-
-.. function:: insort(...)
-
- Alias for :func:`insort_right`.
-
-
-Examples
---------
+ Also note that while the fast search step is O(log n), the slower insertion
+ step is O(n), so the overall operation is slow.
+
+Searching Sorted Lists
+----------------------
+
+The above :func:`bisect` functions are useful for finding insertion points, but
+can be tricky or awkward to use for common searching tasks. The following three
+functions show how to transform them into the standard lookups for sorted
+lists::
+
+ def find(a, key):
+ '''Find leftmost item exact equal to the key.
+ Raise ValueError if no such item exists.
+
+ '''
+ i = bisect_left(a, key)
+ if i < len(a) and a[i] == key:
+ return a[i]
+ raise ValueError('No item found with key equal to: %r' % (key,))
+
+ def find_le(a, key):
+ '''Find largest item less-than or equal to key.
+ Raise ValueError if no such item exists.
+ If multiple keys are equal, return the leftmost.
+
+ '''
+ i = bisect_left(a, key)
+ if i < len(a) and a[i] == key:
+ return a[i]
+ if i == 0:
+ raise ValueError('No item found with key at or below: %r' % (key,))
+ return a[i-1]
+
+ def find_ge(a, key):
+ '''Find smallest item greater-than or equal to key.
+ Raise ValueError if no such item exists.
+ If multiple keys are equal, return the leftmost.
+
+ '''
+ i = bisect_left(a, key)
+ if i == len(a):
+ raise ValueError('No item found with key at or above: %r' % (key,))
+ return a[i]
+
+Other Examples
+--------------
.. _bisect-example:
@@ -104,3 +136,10 @@ of the record in question::
('red', 5)
>>> data[bisect_left(keys, 8)]
('yellow', 8)
+
+.. seealso::
+
+ `SortedCollection recipe
+ <http://code.activestate.com/recipes/577197-sortedcollection/>`_ that
+ encapsulates precomputed keys, allowing straight-forward insertion and
+ searching using a *key* function.