libbisect.tex 3.05 KB
Newer Older
Fred Drake's avatar
Fred Drake committed
1
\section{\module{bisect} ---
2
         Array bisection algorithm}
3

4
\declaremodule{standard}{bisect}
Fred Drake's avatar
Fred Drake committed
5
\modulesynopsis{Array bisection algorithms for binary searching.}
6 7 8 9
\sectionauthor{Fred L. Drake, Jr.}{fdrake@acm.org}
% LaTeX produced by Fred L. Drake, Jr. <fdrake@acm.org>, with an
% example based on the PyModules FAQ entry by Aaron Watters
% <arw@pythonpros.com>.
10

Fred Drake's avatar
Fred Drake committed
11 12 13 14 15 16

This module provides support for maintaining a list in sorted order
without having to sort the list after each insertion.  For long lists
of items with expensive comparison operations, this can be an
improvement over the more common approach.  The module is called
\module{bisect} because it uses a basic bisection algorithm to do its
17
work.  The source code may be most useful as a working example of the
18
algorithm (the boundary conditions are already right!).
Fred Drake's avatar
Fred Drake committed
19 20 21

The following functions are provided:

22 23 24 25 26 27 28 29 30 31
\begin{funcdesc}{bisect_left}{list, item\optional{, lo\optional{, hi}}}
  Locate the proper insertion point for \var{item} in \var{list} to
  maintain sorted order.  The parameters \var{lo} and \var{hi} may be
  used to specify a subset of the list which should be considered; by
  default the entire list is used.  If \var{item} is already present
  in \var{list}, the insertion point will be before (to the left of)
  any existing entries.  The return value is suitable for use as the
  first parameter to \code{\var{list}.insert()}.  This assumes that
  \var{list} is already sorted.
\versionadded{2.1}
Fred Drake's avatar
Fred Drake committed
32 33
\end{funcdesc}

34 35 36 37 38 39 40 41
\begin{funcdesc}{bisect_right}{list, item\optional{, lo\optional{, hi}}}
  Similar to \function{bisect_left()}, but returns an insertion point
  which comes after (to the right of) any existing entries of
  \var{item} in \var{list}.
\versionadded{2.1}
\end{funcdesc}

\begin{funcdesc}{bisect}{\unspecified}
42
  Alias for \function{bisect_right()}.
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
\end{funcdesc}

\begin{funcdesc}{insort_left}{list, item\optional{, lo\optional{, hi}}}
  Insert \var{item} in \var{list} in sorted order.  This is equivalent
  to \code{\var{list}.insert(bisect.bisect_left(\var{list}, \var{item},
  \var{lo}, \var{hi}), \var{item})}.  This assumes that \var{list} is
  already sorted.
\versionadded{2.1}
\end{funcdesc}

\begin{funcdesc}{insort_right}{list, item\optional{, lo\optional{, hi}}}
  Similar to \function{insort_left()}, but inserting \var{item} in
  \var{list} after any existing entries of \var{item}.
\versionadded{2.1}
\end{funcdesc}

\begin{funcdesc}{insort}{\unspecified}
60
  Alias for \function{insort_right()}.
Fred Drake's avatar
Fred Drake committed
61 62 63
\end{funcdesc}


64
\subsection{Examples}
Fred Drake's avatar
Fred Drake committed
65 66 67
\nodename{bisect-example}

The \function{bisect()} function is generally useful for categorizing
68
numeric data.  This example uses \function{bisect()} to look up a
Fred Drake's avatar
Fred Drake committed
69 70 71 72 73 74
letter grade for an exam total (say) based on a set of ordered numeric
breakpoints: 85 and up is an `A', 75..84 is a `B', etc.

\begin{verbatim}
>>> grades = "FEDCBA"
>>> breakpoints = [30, 44, 66, 75, 85]
75
>>> from bisect import bisect
Fred Drake's avatar
Fred Drake committed
76
>>> def grade(total):
77
...           return grades[bisect(breakpoints, total)]
Fred Drake's avatar
Fred Drake committed
78 79 80 81 82
...
>>> grade(66)
'C'
>>> map(grade, [33, 99, 77, 44, 12, 88])
['E', 'A', 'B', 'D', 'F', 'A']
83 84

\end{verbatim}