diff options
author | Raymond Hettinger <python@rcn.com> | 2009-03-31 22:52:48 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2009-03-31 22:52:48 (GMT) |
commit | d2ee64d9dd62942488a2f7fff18a21b87da7f7a9 (patch) | |
tree | 857b139fdf5aa54a64607a2a5f6809710f5de100 /Doc | |
parent | 30911294d8f1bfd18206b0ed66b3a986c21b6f78 (diff) | |
download | cpython-d2ee64d9dd62942488a2f7fff18a21b87da7f7a9.zip cpython-d2ee64d9dd62942488a2f7fff18a21b87da7f7a9.tar.gz cpython-d2ee64d9dd62942488a2f7fff18a21b87da7f7a9.tar.bz2 |
Improve examples for collections.deque()
Diffstat (limited to 'Doc')
-rw-r--r-- | Doc/library/collections.rst | 48 |
1 files changed, 23 insertions, 25 deletions
diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index 4e79e25..50817b0 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -442,6 +442,29 @@ Example: This section shows various approaches to working with deques. +Bounded length deques provide functionality similar to the ``tail`` filter +in Unix:: + + def tail(filename, n=10): + 'Return the last n lines of a file' + return deque(open(filename), n) + +Another approach to using deques is to maintain a sequence of recently +added elements by appending to the right and popping to the left:: + + def moving_average(iterable, n=3): + # moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0 + # http://en.wikipedia.org/wiki/Moving_average + it = iter(iterable) + d = deque(itertools.islice(it, n)) + s = sum(d) + if len(d) == n: + yield s / n + for elem in it: + s += elem - d.popleft() + d.append(elem) + yield s / n + The :meth:`rotate` method provides a way to implement :class:`deque` slicing and deletion. For example, a pure python implementation of ``del d[n]`` relies on the :meth:`rotate` method to position elements to be popped:: @@ -459,31 +482,6 @@ With minor variations on that approach, it is easy to implement Forth style stack manipulations such as ``dup``, ``drop``, ``swap``, ``over``, ``pick``, ``rot``, and ``roll``. -Multi-pass data reduction algorithms can be succinctly expressed and efficiently -coded by extracting elements with multiple calls to :meth:`popleft`, applying -a reduction function, and calling :meth:`append` to add the result back to the -deque. - -For example, building a balanced binary tree of nested lists entails reducing -two adjacent nodes into one by grouping them in a list: - - >>> def maketree(iterable): - ... d = deque(iterable) - ... while len(d) > 1: - ... pair = [d.popleft(), d.popleft()] - ... d.append(pair) - ... return list(d) - ... - >>> print(maketree('abcdefgh')) - [[[['a', 'b'], ['c', 'd']], [['e', 'f'], ['g', 'h']]]] - -Bounded length deques provide functionality similar to the ``tail`` filter -in Unix:: - - def tail(filename, n=10): - 'Return the last n lines of a file' - return deque(open(filename), n) - :class:`defaultdict` objects ---------------------------- |