[2] | 1 | :mod:`collections` --- High-performance container datatypes
|
---|
| 2 | ===========================================================
|
---|
| 3 |
|
---|
| 4 | .. module:: collections
|
---|
| 5 | :synopsis: High-performance datatypes
|
---|
| 6 | .. moduleauthor:: Raymond Hettinger <python@rcn.com>
|
---|
| 7 | .. sectionauthor:: Raymond Hettinger <python@rcn.com>
|
---|
| 8 |
|
---|
| 9 | .. versionadded:: 2.4
|
---|
| 10 |
|
---|
| 11 | .. testsetup:: *
|
---|
| 12 |
|
---|
| 13 | from collections import *
|
---|
| 14 | import itertools
|
---|
| 15 | __name__ = '<doctest>'
|
---|
| 16 |
|
---|
[391] | 17 | **Source code:** :source:`Lib/collections.py` and :source:`Lib/_abcoll.py`
|
---|
[2] | 18 |
|
---|
[391] | 19 | --------------
|
---|
[2] | 20 |
|
---|
[391] | 21 | This module implements specialized container datatypes providing alternatives to
|
---|
| 22 | Python's general purpose built-in containers, :class:`dict`, :class:`list`,
|
---|
| 23 | :class:`set`, and :class:`tuple`.
|
---|
[2] | 24 |
|
---|
[391] | 25 | ===================== ==================================================================== ===========================
|
---|
| 26 | :func:`namedtuple` factory function for creating tuple subclasses with named fields .. versionadded:: 2.6
|
---|
| 27 | :class:`deque` list-like container with fast appends and pops on either end .. versionadded:: 2.4
|
---|
| 28 | :class:`Counter` dict subclass for counting hashable objects .. versionadded:: 2.7
|
---|
| 29 | :class:`OrderedDict` dict subclass that remembers the order entries were added .. versionadded:: 2.7
|
---|
| 30 | :class:`defaultdict` dict subclass that calls a factory function to supply missing values .. versionadded:: 2.5
|
---|
| 31 | ===================== ==================================================================== ===========================
|
---|
[2] | 32 |
|
---|
[391] | 33 | In addition to the concrete container classes, the collections module provides
|
---|
| 34 | :ref:`abstract base classes <collections-abstract-base-classes>` that can be
|
---|
| 35 | used to test whether a class provides a particular interface, for example,
|
---|
| 36 | whether it is hashable or a mapping.
|
---|
[2] | 37 |
|
---|
| 38 |
|
---|
[391] | 39 | :class:`Counter` objects
|
---|
| 40 | ------------------------
|
---|
[2] | 41 |
|
---|
[391] | 42 | A counter tool is provided to support convenient and rapid tallies.
|
---|
| 43 | For example::
|
---|
[2] | 44 |
|
---|
[391] | 45 | >>> # Tally occurrences of words in a list
|
---|
| 46 | >>> cnt = Counter()
|
---|
| 47 | >>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
|
---|
| 48 | ... cnt[word] += 1
|
---|
| 49 | >>> cnt
|
---|
| 50 | Counter({'blue': 3, 'red': 2, 'green': 1})
|
---|
[2] | 51 |
|
---|
[391] | 52 | >>> # Find the ten most common words in Hamlet
|
---|
| 53 | >>> import re
|
---|
| 54 | >>> words = re.findall(r'\w+', open('hamlet.txt').read().lower())
|
---|
| 55 | >>> Counter(words).most_common(10)
|
---|
| 56 | [('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631),
|
---|
| 57 | ('you', 554), ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)]
|
---|
[2] | 58 |
|
---|
[391] | 59 | .. class:: Counter([iterable-or-mapping])
|
---|
[2] | 60 |
|
---|
[391] | 61 | A :class:`Counter` is a :class:`dict` subclass for counting hashable objects.
|
---|
| 62 | It is an unordered collection where elements are stored as dictionary keys
|
---|
| 63 | and their counts are stored as dictionary values. Counts are allowed to be
|
---|
| 64 | any integer value including zero or negative counts. The :class:`Counter`
|
---|
| 65 | class is similar to bags or multisets in other languages.
|
---|
[2] | 66 |
|
---|
[391] | 67 | Elements are counted from an *iterable* or initialized from another
|
---|
| 68 | *mapping* (or counter):
|
---|
[2] | 69 |
|
---|
[391] | 70 | >>> c = Counter() # a new, empty counter
|
---|
| 71 | >>> c = Counter('gallahad') # a new counter from an iterable
|
---|
| 72 | >>> c = Counter({'red': 4, 'blue': 2}) # a new counter from a mapping
|
---|
| 73 | >>> c = Counter(cats=4, dogs=8) # a new counter from keyword args
|
---|
[2] | 74 |
|
---|
[391] | 75 | Counter objects have a dictionary interface except that they return a zero
|
---|
| 76 | count for missing items instead of raising a :exc:`KeyError`:
|
---|
[2] | 77 |
|
---|
[391] | 78 | >>> c = Counter(['eggs', 'ham'])
|
---|
| 79 | >>> c['bacon'] # count of a missing element is zero
|
---|
| 80 | 0
|
---|
[2] | 81 |
|
---|
[391] | 82 | Setting a count to zero does not remove an element from a counter.
|
---|
| 83 | Use ``del`` to remove it entirely:
|
---|
[2] | 84 |
|
---|
[391] | 85 | >>> c['sausage'] = 0 # counter entry with a zero count
|
---|
| 86 | >>> del c['sausage'] # del actually removes the entry
|
---|
[2] | 87 |
|
---|
[391] | 88 | .. versionadded:: 2.7
|
---|
[2] | 89 |
|
---|
| 90 |
|
---|
[391] | 91 | Counter objects support three methods beyond those available for all
|
---|
| 92 | dictionaries:
|
---|
[2] | 93 |
|
---|
[391] | 94 | .. method:: elements()
|
---|
[2] | 95 |
|
---|
[391] | 96 | Return an iterator over elements repeating each as many times as its
|
---|
| 97 | count. Elements are returned in arbitrary order. If an element's count
|
---|
| 98 | is less than one, :meth:`elements` will ignore it.
|
---|
[2] | 99 |
|
---|
[391] | 100 | >>> c = Counter(a=4, b=2, c=0, d=-2)
|
---|
| 101 | >>> list(c.elements())
|
---|
| 102 | ['a', 'a', 'a', 'a', 'b', 'b']
|
---|
[2] | 103 |
|
---|
[391] | 104 | .. method:: most_common([n])
|
---|
[2] | 105 |
|
---|
[391] | 106 | Return a list of the *n* most common elements and their counts from the
|
---|
| 107 | most common to the least. If *n* is not specified, :func:`most_common`
|
---|
| 108 | returns *all* elements in the counter. Elements with equal counts are
|
---|
| 109 | ordered arbitrarily:
|
---|
[2] | 110 |
|
---|
[391] | 111 | >>> Counter('abracadabra').most_common(3)
|
---|
| 112 | [('a', 5), ('r', 2), ('b', 2)]
|
---|
[2] | 113 |
|
---|
[391] | 114 | .. method:: subtract([iterable-or-mapping])
|
---|
| 115 |
|
---|
| 116 | Elements are subtracted from an *iterable* or from another *mapping*
|
---|
| 117 | (or counter). Like :meth:`dict.update` but subtracts counts instead
|
---|
| 118 | of replacing them. Both inputs and outputs may be zero or negative.
|
---|
| 119 |
|
---|
| 120 | >>> c = Counter(a=4, b=2, c=0, d=-2)
|
---|
| 121 | >>> d = Counter(a=1, b=2, c=3, d=4)
|
---|
| 122 | >>> c.subtract(d)
|
---|
| 123 | >>> c
|
---|
| 124 | Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
|
---|
| 125 |
|
---|
| 126 | The usual dictionary methods are available for :class:`Counter` objects
|
---|
| 127 | except for two which work differently for counters.
|
---|
| 128 |
|
---|
| 129 | .. method:: fromkeys(iterable)
|
---|
| 130 |
|
---|
| 131 | This class method is not implemented for :class:`Counter` objects.
|
---|
| 132 |
|
---|
| 133 | .. method:: update([iterable-or-mapping])
|
---|
| 134 |
|
---|
| 135 | Elements are counted from an *iterable* or added-in from another
|
---|
| 136 | *mapping* (or counter). Like :meth:`dict.update` but adds counts
|
---|
| 137 | instead of replacing them. Also, the *iterable* is expected to be a
|
---|
| 138 | sequence of elements, not a sequence of ``(key, value)`` pairs.
|
---|
| 139 |
|
---|
| 140 | Common patterns for working with :class:`Counter` objects::
|
---|
| 141 |
|
---|
| 142 | sum(c.values()) # total of all counts
|
---|
| 143 | c.clear() # reset all counts
|
---|
| 144 | list(c) # list unique elements
|
---|
| 145 | set(c) # convert to a set
|
---|
| 146 | dict(c) # convert to a regular dictionary
|
---|
| 147 | c.items() # convert to a list of (elem, cnt) pairs
|
---|
| 148 | Counter(dict(list_of_pairs)) # convert from a list of (elem, cnt) pairs
|
---|
| 149 | c.most_common()[:-n-1:-1] # n least common elements
|
---|
| 150 | c += Counter() # remove zero and negative counts
|
---|
| 151 |
|
---|
| 152 | Several mathematical operations are provided for combining :class:`Counter`
|
---|
| 153 | objects to produce multisets (counters that have counts greater than zero).
|
---|
| 154 | Addition and subtraction combine counters by adding or subtracting the counts
|
---|
| 155 | of corresponding elements. Intersection and union return the minimum and
|
---|
| 156 | maximum of corresponding counts. Each operation can accept inputs with signed
|
---|
| 157 | counts, but the output will exclude results with counts of zero or less.
|
---|
| 158 |
|
---|
| 159 | >>> c = Counter(a=3, b=1)
|
---|
| 160 | >>> d = Counter(a=1, b=2)
|
---|
| 161 | >>> c + d # add two counters together: c[x] + d[x]
|
---|
| 162 | Counter({'a': 4, 'b': 3})
|
---|
| 163 | >>> c - d # subtract (keeping only positive counts)
|
---|
| 164 | Counter({'a': 2})
|
---|
| 165 | >>> c & d # intersection: min(c[x], d[x])
|
---|
| 166 | Counter({'a': 1, 'b': 1})
|
---|
| 167 | >>> c | d # union: max(c[x], d[x])
|
---|
| 168 | Counter({'a': 3, 'b': 2})
|
---|
| 169 |
|
---|
| 170 | .. note::
|
---|
| 171 |
|
---|
| 172 | Counters were primarily designed to work with positive integers to represent
|
---|
| 173 | running counts; however, care was taken to not unnecessarily preclude use
|
---|
| 174 | cases needing other types or negative values. To help with those use cases,
|
---|
| 175 | this section documents the minimum range and type restrictions.
|
---|
| 176 |
|
---|
| 177 | * The :class:`Counter` class itself is a dictionary subclass with no
|
---|
| 178 | restrictions on its keys and values. The values are intended to be numbers
|
---|
| 179 | representing counts, but you *could* store anything in the value field.
|
---|
| 180 |
|
---|
| 181 | * The :meth:`most_common` method requires only that the values be orderable.
|
---|
| 182 |
|
---|
| 183 | * For in-place operations such as ``c[key] += 1``, the value type need only
|
---|
| 184 | support addition and subtraction. So fractions, floats, and decimals would
|
---|
| 185 | work and negative values are supported. The same is also true for
|
---|
| 186 | :meth:`update` and :meth:`subtract` which allow negative and zero values
|
---|
| 187 | for both inputs and outputs.
|
---|
| 188 |
|
---|
| 189 | * The multiset methods are designed only for use cases with positive values.
|
---|
| 190 | The inputs may be negative or zero, but only outputs with positive values
|
---|
| 191 | are created. There are no type restrictions, but the value type needs to
|
---|
| 192 | support addition, subtraction, and comparison.
|
---|
| 193 |
|
---|
| 194 | * The :meth:`elements` method requires integer counts. It ignores zero and
|
---|
| 195 | negative counts.
|
---|
| 196 |
|
---|
[2] | 197 | .. seealso::
|
---|
| 198 |
|
---|
[391] | 199 | * `Counter class <http://code.activestate.com/recipes/576611/>`_
|
---|
| 200 | adapted for Python 2.5 and an early `Bag recipe
|
---|
| 201 | <http://code.activestate.com/recipes/259174/>`_ for Python 2.4.
|
---|
[2] | 202 |
|
---|
[391] | 203 | * `Bag class <http://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html>`_
|
---|
| 204 | in Smalltalk.
|
---|
[2] | 205 |
|
---|
[391] | 206 | * Wikipedia entry for `Multisets <http://en.wikipedia.org/wiki/Multiset>`_.
|
---|
[2] | 207 |
|
---|
[391] | 208 | * `C++ multisets <http://www.demo2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm>`_
|
---|
| 209 | tutorial with examples.
|
---|
| 210 |
|
---|
| 211 | * For mathematical operations on multisets and their use cases, see
|
---|
| 212 | *Knuth, Donald. The Art of Computer Programming Volume II,
|
---|
| 213 | Section 4.6.3, Exercise 19*.
|
---|
| 214 |
|
---|
| 215 | * To enumerate all distinct multisets of a given size over a given set of
|
---|
| 216 | elements, see :func:`itertools.combinations_with_replacement`.
|
---|
| 217 |
|
---|
| 218 | map(Counter, combinations_with_replacement('ABC', 2)) --> AA AB AC BB BC CC
|
---|
| 219 |
|
---|
| 220 |
|
---|
[2] | 221 | :class:`deque` objects
|
---|
| 222 | ----------------------
|
---|
| 223 |
|
---|
| 224 | .. class:: deque([iterable[, maxlen]])
|
---|
| 225 |
|
---|
| 226 | Returns a new deque object initialized left-to-right (using :meth:`append`) with
|
---|
| 227 | data from *iterable*. If *iterable* is not specified, the new deque is empty.
|
---|
| 228 |
|
---|
| 229 | Deques are a generalization of stacks and queues (the name is pronounced "deck"
|
---|
| 230 | and is short for "double-ended queue"). Deques support thread-safe, memory
|
---|
| 231 | efficient appends and pops from either side of the deque with approximately the
|
---|
| 232 | same O(1) performance in either direction.
|
---|
| 233 |
|
---|
| 234 | Though :class:`list` objects support similar operations, they are optimized for
|
---|
| 235 | fast fixed-length operations and incur O(n) memory movement costs for
|
---|
| 236 | ``pop(0)`` and ``insert(0, v)`` operations which change both the size and
|
---|
| 237 | position of the underlying data representation.
|
---|
| 238 |
|
---|
| 239 | .. versionadded:: 2.4
|
---|
| 240 |
|
---|
| 241 | If *maxlen* is not specified or is *None*, deques may grow to an
|
---|
| 242 | arbitrary length. Otherwise, the deque is bounded to the specified maximum
|
---|
| 243 | length. Once a bounded length deque is full, when new items are added, a
|
---|
| 244 | corresponding number of items are discarded from the opposite end. Bounded
|
---|
| 245 | length deques provide functionality similar to the ``tail`` filter in
|
---|
| 246 | Unix. They are also useful for tracking transactions and other pools of data
|
---|
| 247 | where only the most recent activity is of interest.
|
---|
| 248 |
|
---|
| 249 | .. versionchanged:: 2.6
|
---|
| 250 | Added *maxlen* parameter.
|
---|
| 251 |
|
---|
| 252 | Deque objects support the following methods:
|
---|
| 253 |
|
---|
| 254 |
|
---|
| 255 | .. method:: append(x)
|
---|
| 256 |
|
---|
| 257 | Add *x* to the right side of the deque.
|
---|
| 258 |
|
---|
| 259 |
|
---|
| 260 | .. method:: appendleft(x)
|
---|
| 261 |
|
---|
| 262 | Add *x* to the left side of the deque.
|
---|
| 263 |
|
---|
| 264 |
|
---|
| 265 | .. method:: clear()
|
---|
| 266 |
|
---|
| 267 | Remove all elements from the deque leaving it with length 0.
|
---|
| 268 |
|
---|
| 269 |
|
---|
[391] | 270 | .. method:: count(x)
|
---|
| 271 |
|
---|
| 272 | Count the number of deque elements equal to *x*.
|
---|
| 273 |
|
---|
| 274 | .. versionadded:: 2.7
|
---|
| 275 |
|
---|
[2] | 276 | .. method:: extend(iterable)
|
---|
| 277 |
|
---|
| 278 | Extend the right side of the deque by appending elements from the iterable
|
---|
| 279 | argument.
|
---|
| 280 |
|
---|
| 281 |
|
---|
| 282 | .. method:: extendleft(iterable)
|
---|
| 283 |
|
---|
| 284 | Extend the left side of the deque by appending elements from *iterable*.
|
---|
| 285 | Note, the series of left appends results in reversing the order of
|
---|
| 286 | elements in the iterable argument.
|
---|
| 287 |
|
---|
| 288 |
|
---|
| 289 | .. method:: pop()
|
---|
| 290 |
|
---|
| 291 | Remove and return an element from the right side of the deque. If no
|
---|
| 292 | elements are present, raises an :exc:`IndexError`.
|
---|
| 293 |
|
---|
| 294 |
|
---|
| 295 | .. method:: popleft()
|
---|
| 296 |
|
---|
| 297 | Remove and return an element from the left side of the deque. If no
|
---|
| 298 | elements are present, raises an :exc:`IndexError`.
|
---|
| 299 |
|
---|
| 300 |
|
---|
| 301 | .. method:: remove(value)
|
---|
| 302 |
|
---|
| 303 | Removed the first occurrence of *value*. If not found, raises a
|
---|
| 304 | :exc:`ValueError`.
|
---|
| 305 |
|
---|
| 306 | .. versionadded:: 2.5
|
---|
| 307 |
|
---|
[391] | 308 | .. method:: reverse()
|
---|
[2] | 309 |
|
---|
[391] | 310 | Reverse the elements of the deque in-place and then return ``None``.
|
---|
| 311 |
|
---|
| 312 | .. versionadded:: 2.7
|
---|
| 313 |
|
---|
[2] | 314 | .. method:: rotate(n)
|
---|
| 315 |
|
---|
| 316 | Rotate the deque *n* steps to the right. If *n* is negative, rotate to
|
---|
| 317 | the left. Rotating one step to the right is equivalent to:
|
---|
| 318 | ``d.appendleft(d.pop())``.
|
---|
| 319 |
|
---|
| 320 |
|
---|
[391] | 321 | Deque objects also provide one read-only attribute:
|
---|
| 322 |
|
---|
| 323 | .. attribute:: maxlen
|
---|
| 324 |
|
---|
| 325 | Maximum size of a deque or *None* if unbounded.
|
---|
| 326 |
|
---|
| 327 | .. versionadded:: 2.7
|
---|
| 328 |
|
---|
| 329 |
|
---|
[2] | 330 | In addition to the above, deques support iteration, pickling, ``len(d)``,
|
---|
| 331 | ``reversed(d)``, ``copy.copy(d)``, ``copy.deepcopy(d)``, membership testing with
|
---|
| 332 | the :keyword:`in` operator, and subscript references such as ``d[-1]``. Indexed
|
---|
| 333 | access is O(1) at both ends but slows to O(n) in the middle. For fast random
|
---|
| 334 | access, use lists instead.
|
---|
| 335 |
|
---|
| 336 | Example:
|
---|
| 337 |
|
---|
| 338 | .. doctest::
|
---|
| 339 |
|
---|
| 340 | >>> from collections import deque
|
---|
| 341 | >>> d = deque('ghi') # make a new deque with three items
|
---|
| 342 | >>> for elem in d: # iterate over the deque's elements
|
---|
| 343 | ... print elem.upper()
|
---|
| 344 | G
|
---|
| 345 | H
|
---|
| 346 | I
|
---|
| 347 |
|
---|
| 348 | >>> d.append('j') # add a new entry to the right side
|
---|
| 349 | >>> d.appendleft('f') # add a new entry to the left side
|
---|
| 350 | >>> d # show the representation of the deque
|
---|
| 351 | deque(['f', 'g', 'h', 'i', 'j'])
|
---|
| 352 |
|
---|
| 353 | >>> d.pop() # return and remove the rightmost item
|
---|
| 354 | 'j'
|
---|
| 355 | >>> d.popleft() # return and remove the leftmost item
|
---|
| 356 | 'f'
|
---|
| 357 | >>> list(d) # list the contents of the deque
|
---|
| 358 | ['g', 'h', 'i']
|
---|
| 359 | >>> d[0] # peek at leftmost item
|
---|
| 360 | 'g'
|
---|
| 361 | >>> d[-1] # peek at rightmost item
|
---|
| 362 | 'i'
|
---|
| 363 |
|
---|
| 364 | >>> list(reversed(d)) # list the contents of a deque in reverse
|
---|
| 365 | ['i', 'h', 'g']
|
---|
| 366 | >>> 'h' in d # search the deque
|
---|
| 367 | True
|
---|
| 368 | >>> d.extend('jkl') # add multiple elements at once
|
---|
| 369 | >>> d
|
---|
| 370 | deque(['g', 'h', 'i', 'j', 'k', 'l'])
|
---|
| 371 | >>> d.rotate(1) # right rotation
|
---|
| 372 | >>> d
|
---|
| 373 | deque(['l', 'g', 'h', 'i', 'j', 'k'])
|
---|
| 374 | >>> d.rotate(-1) # left rotation
|
---|
| 375 | >>> d
|
---|
| 376 | deque(['g', 'h', 'i', 'j', 'k', 'l'])
|
---|
| 377 |
|
---|
| 378 | >>> deque(reversed(d)) # make a new deque in reverse order
|
---|
| 379 | deque(['l', 'k', 'j', 'i', 'h', 'g'])
|
---|
| 380 | >>> d.clear() # empty the deque
|
---|
| 381 | >>> d.pop() # cannot pop from an empty deque
|
---|
| 382 | Traceback (most recent call last):
|
---|
| 383 | File "<pyshell#6>", line 1, in -toplevel-
|
---|
| 384 | d.pop()
|
---|
| 385 | IndexError: pop from an empty deque
|
---|
| 386 |
|
---|
| 387 | >>> d.extendleft('abc') # extendleft() reverses the input order
|
---|
| 388 | >>> d
|
---|
| 389 | deque(['c', 'b', 'a'])
|
---|
| 390 |
|
---|
| 391 |
|
---|
| 392 | :class:`deque` Recipes
|
---|
| 393 | ^^^^^^^^^^^^^^^^^^^^^^
|
---|
| 394 |
|
---|
| 395 | This section shows various approaches to working with deques.
|
---|
| 396 |
|
---|
| 397 | Bounded length deques provide functionality similar to the ``tail`` filter
|
---|
| 398 | in Unix::
|
---|
| 399 |
|
---|
| 400 | def tail(filename, n=10):
|
---|
| 401 | 'Return the last n lines of a file'
|
---|
| 402 | return deque(open(filename), n)
|
---|
| 403 |
|
---|
| 404 | Another approach to using deques is to maintain a sequence of recently
|
---|
| 405 | added elements by appending to the right and popping to the left::
|
---|
| 406 |
|
---|
| 407 | def moving_average(iterable, n=3):
|
---|
| 408 | # moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0
|
---|
| 409 | # http://en.wikipedia.org/wiki/Moving_average
|
---|
| 410 | it = iter(iterable)
|
---|
| 411 | d = deque(itertools.islice(it, n-1))
|
---|
| 412 | d.appendleft(0)
|
---|
| 413 | s = sum(d)
|
---|
| 414 | for elem in it:
|
---|
| 415 | s += elem - d.popleft()
|
---|
| 416 | d.append(elem)
|
---|
| 417 | yield s / float(n)
|
---|
| 418 |
|
---|
| 419 | The :meth:`rotate` method provides a way to implement :class:`deque` slicing and
|
---|
| 420 | deletion. For example, a pure Python implementation of ``del d[n]`` relies on
|
---|
| 421 | the :meth:`rotate` method to position elements to be popped::
|
---|
| 422 |
|
---|
| 423 | def delete_nth(d, n):
|
---|
| 424 | d.rotate(-n)
|
---|
| 425 | d.popleft()
|
---|
| 426 | d.rotate(n)
|
---|
| 427 |
|
---|
| 428 | To implement :class:`deque` slicing, use a similar approach applying
|
---|
| 429 | :meth:`rotate` to bring a target element to the left side of the deque. Remove
|
---|
| 430 | old entries with :meth:`popleft`, add new entries with :meth:`extend`, and then
|
---|
| 431 | reverse the rotation.
|
---|
| 432 | With minor variations on that approach, it is easy to implement Forth style
|
---|
| 433 | stack manipulations such as ``dup``, ``drop``, ``swap``, ``over``, ``pick``,
|
---|
| 434 | ``rot``, and ``roll``.
|
---|
| 435 |
|
---|
| 436 |
|
---|
| 437 | :class:`defaultdict` objects
|
---|
| 438 | ----------------------------
|
---|
| 439 |
|
---|
| 440 | .. class:: defaultdict([default_factory[, ...]])
|
---|
| 441 |
|
---|
| 442 | Returns a new dictionary-like object. :class:`defaultdict` is a subclass of the
|
---|
| 443 | built-in :class:`dict` class. It overrides one method and adds one writable
|
---|
| 444 | instance variable. The remaining functionality is the same as for the
|
---|
| 445 | :class:`dict` class and is not documented here.
|
---|
| 446 |
|
---|
| 447 | The first argument provides the initial value for the :attr:`default_factory`
|
---|
| 448 | attribute; it defaults to ``None``. All remaining arguments are treated the same
|
---|
| 449 | as if they were passed to the :class:`dict` constructor, including keyword
|
---|
| 450 | arguments.
|
---|
| 451 |
|
---|
| 452 | .. versionadded:: 2.5
|
---|
| 453 |
|
---|
| 454 | :class:`defaultdict` objects support the following method in addition to the
|
---|
| 455 | standard :class:`dict` operations:
|
---|
| 456 |
|
---|
[391] | 457 | .. method:: __missing__(key)
|
---|
[2] | 458 |
|
---|
| 459 | If the :attr:`default_factory` attribute is ``None``, this raises a
|
---|
| 460 | :exc:`KeyError` exception with the *key* as argument.
|
---|
| 461 |
|
---|
| 462 | If :attr:`default_factory` is not ``None``, it is called without arguments
|
---|
| 463 | to provide a default value for the given *key*, this value is inserted in
|
---|
| 464 | the dictionary for the *key*, and returned.
|
---|
| 465 |
|
---|
| 466 | If calling :attr:`default_factory` raises an exception this exception is
|
---|
| 467 | propagated unchanged.
|
---|
| 468 |
|
---|
| 469 | This method is called by the :meth:`__getitem__` method of the
|
---|
| 470 | :class:`dict` class when the requested key is not found; whatever it
|
---|
| 471 | returns or raises is then returned or raised by :meth:`__getitem__`.
|
---|
| 472 |
|
---|
[391] | 473 | Note that :meth:`__missing__` is *not* called for any operations besides
|
---|
| 474 | :meth:`__getitem__`. This means that :meth:`get` will, like normal
|
---|
| 475 | dictionaries, return ``None`` as a default rather than using
|
---|
| 476 | :attr:`default_factory`.
|
---|
[2] | 477 |
|
---|
[391] | 478 |
|
---|
[2] | 479 | :class:`defaultdict` objects support the following instance variable:
|
---|
| 480 |
|
---|
| 481 |
|
---|
[391] | 482 | .. attribute:: default_factory
|
---|
[2] | 483 |
|
---|
| 484 | This attribute is used by the :meth:`__missing__` method; it is
|
---|
| 485 | initialized from the first argument to the constructor, if present, or to
|
---|
| 486 | ``None``, if absent.
|
---|
| 487 |
|
---|
| 488 |
|
---|
| 489 | :class:`defaultdict` Examples
|
---|
| 490 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
---|
| 491 |
|
---|
| 492 | Using :class:`list` as the :attr:`default_factory`, it is easy to group a
|
---|
| 493 | sequence of key-value pairs into a dictionary of lists:
|
---|
| 494 |
|
---|
| 495 | >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
|
---|
| 496 | >>> d = defaultdict(list)
|
---|
| 497 | >>> for k, v in s:
|
---|
| 498 | ... d[k].append(v)
|
---|
| 499 | ...
|
---|
| 500 | >>> d.items()
|
---|
| 501 | [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
|
---|
| 502 |
|
---|
| 503 | When each key is encountered for the first time, it is not already in the
|
---|
| 504 | mapping; so an entry is automatically created using the :attr:`default_factory`
|
---|
| 505 | function which returns an empty :class:`list`. The :meth:`list.append`
|
---|
| 506 | operation then attaches the value to the new list. When keys are encountered
|
---|
| 507 | again, the look-up proceeds normally (returning the list for that key) and the
|
---|
| 508 | :meth:`list.append` operation adds another value to the list. This technique is
|
---|
| 509 | simpler and faster than an equivalent technique using :meth:`dict.setdefault`:
|
---|
| 510 |
|
---|
| 511 | >>> d = {}
|
---|
| 512 | >>> for k, v in s:
|
---|
| 513 | ... d.setdefault(k, []).append(v)
|
---|
| 514 | ...
|
---|
| 515 | >>> d.items()
|
---|
| 516 | [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
|
---|
| 517 |
|
---|
| 518 | Setting the :attr:`default_factory` to :class:`int` makes the
|
---|
| 519 | :class:`defaultdict` useful for counting (like a bag or multiset in other
|
---|
| 520 | languages):
|
---|
| 521 |
|
---|
| 522 | >>> s = 'mississippi'
|
---|
| 523 | >>> d = defaultdict(int)
|
---|
| 524 | >>> for k in s:
|
---|
| 525 | ... d[k] += 1
|
---|
| 526 | ...
|
---|
| 527 | >>> d.items()
|
---|
| 528 | [('i', 4), ('p', 2), ('s', 4), ('m', 1)]
|
---|
| 529 |
|
---|
| 530 | When a letter is first encountered, it is missing from the mapping, so the
|
---|
| 531 | :attr:`default_factory` function calls :func:`int` to supply a default count of
|
---|
| 532 | zero. The increment operation then builds up the count for each letter.
|
---|
| 533 |
|
---|
| 534 | The function :func:`int` which always returns zero is just a special case of
|
---|
| 535 | constant functions. A faster and more flexible way to create constant functions
|
---|
| 536 | is to use :func:`itertools.repeat` which can supply any constant value (not just
|
---|
| 537 | zero):
|
---|
| 538 |
|
---|
| 539 | >>> def constant_factory(value):
|
---|
| 540 | ... return itertools.repeat(value).next
|
---|
| 541 | >>> d = defaultdict(constant_factory('<missing>'))
|
---|
| 542 | >>> d.update(name='John', action='ran')
|
---|
| 543 | >>> '%(name)s %(action)s to %(object)s' % d
|
---|
| 544 | 'John ran to <missing>'
|
---|
| 545 |
|
---|
| 546 | Setting the :attr:`default_factory` to :class:`set` makes the
|
---|
| 547 | :class:`defaultdict` useful for building a dictionary of sets:
|
---|
| 548 |
|
---|
| 549 | >>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
|
---|
| 550 | >>> d = defaultdict(set)
|
---|
| 551 | >>> for k, v in s:
|
---|
| 552 | ... d[k].add(v)
|
---|
| 553 | ...
|
---|
| 554 | >>> d.items()
|
---|
| 555 | [('blue', set([2, 4])), ('red', set([1, 3]))]
|
---|
| 556 |
|
---|
| 557 |
|
---|
| 558 | :func:`namedtuple` Factory Function for Tuples with Named Fields
|
---|
| 559 | ----------------------------------------------------------------
|
---|
| 560 |
|
---|
| 561 | Named tuples assign meaning to each position in a tuple and allow for more readable,
|
---|
| 562 | self-documenting code. They can be used wherever regular tuples are used, and
|
---|
| 563 | they add the ability to access fields by name instead of position index.
|
---|
| 564 |
|
---|
[391] | 565 | .. function:: namedtuple(typename, field_names, [verbose=False], [rename=False])
|
---|
[2] | 566 |
|
---|
| 567 | Returns a new tuple subclass named *typename*. The new subclass is used to
|
---|
| 568 | create tuple-like objects that have fields accessible by attribute lookup as
|
---|
| 569 | well as being indexable and iterable. Instances of the subclass also have a
|
---|
| 570 | helpful docstring (with typename and field_names) and a helpful :meth:`__repr__`
|
---|
| 571 | method which lists the tuple contents in a ``name=value`` format.
|
---|
| 572 |
|
---|
[391] | 573 | The *field_names* are a sequence of strings such as ``['x', 'y']``.
|
---|
| 574 | Alternatively, *field_names* can be a single string with each fieldname
|
---|
| 575 | separated by whitespace and/or commas, for example ``'x y'`` or ``'x, y'``.
|
---|
[2] | 576 |
|
---|
| 577 | Any valid Python identifier may be used for a fieldname except for names
|
---|
| 578 | starting with an underscore. Valid identifiers consist of letters, digits,
|
---|
| 579 | and underscores but do not start with a digit or underscore and cannot be
|
---|
| 580 | a :mod:`keyword` such as *class*, *for*, *return*, *global*, *pass*, *print*,
|
---|
| 581 | or *raise*.
|
---|
| 582 |
|
---|
[391] | 583 | If *rename* is true, invalid fieldnames are automatically replaced
|
---|
| 584 | with positional names. For example, ``['abc', 'def', 'ghi', 'abc']`` is
|
---|
| 585 | converted to ``['abc', '_1', 'ghi', '_3']``, eliminating the keyword
|
---|
| 586 | ``def`` and the duplicate fieldname ``abc``.
|
---|
| 587 |
|
---|
[2] | 588 | If *verbose* is true, the class definition is printed just before being built.
|
---|
| 589 |
|
---|
| 590 | Named tuple instances do not have per-instance dictionaries, so they are
|
---|
| 591 | lightweight and require no more memory than regular tuples.
|
---|
| 592 |
|
---|
| 593 | .. versionadded:: 2.6
|
---|
| 594 |
|
---|
[391] | 595 | .. versionchanged:: 2.7
|
---|
| 596 | added support for *rename*.
|
---|
| 597 |
|
---|
[2] | 598 | Example:
|
---|
| 599 |
|
---|
| 600 | .. doctest::
|
---|
| 601 | :options: +NORMALIZE_WHITESPACE
|
---|
| 602 |
|
---|
[391] | 603 | >>> Point = namedtuple('Point', ['x', 'y'], verbose=True)
|
---|
| 604 | class Point(tuple):
|
---|
| 605 | 'Point(x, y)'
|
---|
| 606 | <BLANKLINE>
|
---|
| 607 | __slots__ = ()
|
---|
| 608 | <BLANKLINE>
|
---|
| 609 | _fields = ('x', 'y')
|
---|
| 610 | <BLANKLINE>
|
---|
| 611 | def __new__(_cls, x, y):
|
---|
| 612 | 'Create a new instance of Point(x, y)'
|
---|
| 613 | return _tuple.__new__(_cls, (x, y))
|
---|
| 614 | <BLANKLINE>
|
---|
| 615 | @classmethod
|
---|
| 616 | def _make(cls, iterable, new=tuple.__new__, len=len):
|
---|
| 617 | 'Make a new Point object from a sequence or iterable'
|
---|
| 618 | result = new(cls, iterable)
|
---|
| 619 | if len(result) != 2:
|
---|
| 620 | raise TypeError('Expected 2 arguments, got %d' % len(result))
|
---|
| 621 | return result
|
---|
| 622 | <BLANKLINE>
|
---|
| 623 | def __repr__(self):
|
---|
| 624 | 'Return a nicely formatted representation string'
|
---|
| 625 | return 'Point(x=%r, y=%r)' % self
|
---|
| 626 | <BLANKLINE>
|
---|
| 627 | def _asdict(self):
|
---|
| 628 | 'Return a new OrderedDict which maps field names to their values'
|
---|
| 629 | return OrderedDict(zip(self._fields, self))
|
---|
| 630 | <BLANKLINE>
|
---|
| 631 | def _replace(_self, **kwds):
|
---|
| 632 | 'Return a new Point object replacing specified fields with new values'
|
---|
| 633 | result = _self._make(map(kwds.pop, ('x', 'y'), _self))
|
---|
| 634 | if kwds:
|
---|
| 635 | raise ValueError('Got unexpected field names: %r' % kwds.keys())
|
---|
| 636 | return result
|
---|
| 637 | <BLANKLINE>
|
---|
| 638 | def __getnewargs__(self):
|
---|
| 639 | 'Return self as a plain tuple. Used by copy and pickle.'
|
---|
| 640 | return tuple(self)
|
---|
| 641 | <BLANKLINE>
|
---|
| 642 | __dict__ = _property(_asdict)
|
---|
| 643 | <BLANKLINE>
|
---|
| 644 | def __getstate__(self):
|
---|
| 645 | 'Exclude the OrderedDict from pickling'
|
---|
| 646 | pass
|
---|
| 647 | <BLANKLINE>
|
---|
| 648 | x = _property(_itemgetter(0), doc='Alias for field number 0')
|
---|
| 649 | <BLANKLINE>
|
---|
| 650 | y = _property(_itemgetter(1), doc='Alias for field number 1')
|
---|
| 651 | <BLANKLINE>
|
---|
| 652 |
|
---|
[2] | 653 | >>> p = Point(11, y=22) # instantiate with positional or keyword arguments
|
---|
| 654 | >>> p[0] + p[1] # indexable like the plain tuple (11, 22)
|
---|
| 655 | 33
|
---|
| 656 | >>> x, y = p # unpack like a regular tuple
|
---|
| 657 | >>> x, y
|
---|
| 658 | (11, 22)
|
---|
| 659 | >>> p.x + p.y # fields also accessible by name
|
---|
| 660 | 33
|
---|
| 661 | >>> p # readable __repr__ with a name=value style
|
---|
| 662 | Point(x=11, y=22)
|
---|
| 663 |
|
---|
| 664 | Named tuples are especially useful for assigning field names to result tuples returned
|
---|
| 665 | by the :mod:`csv` or :mod:`sqlite3` modules::
|
---|
| 666 |
|
---|
| 667 | EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
|
---|
| 668 |
|
---|
| 669 | import csv
|
---|
| 670 | for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
|
---|
| 671 | print emp.name, emp.title
|
---|
| 672 |
|
---|
| 673 | import sqlite3
|
---|
| 674 | conn = sqlite3.connect('/companydata')
|
---|
| 675 | cursor = conn.cursor()
|
---|
| 676 | cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
|
---|
| 677 | for emp in map(EmployeeRecord._make, cursor.fetchall()):
|
---|
| 678 | print emp.name, emp.title
|
---|
| 679 |
|
---|
| 680 | In addition to the methods inherited from tuples, named tuples support
|
---|
| 681 | three additional methods and one attribute. To prevent conflicts with
|
---|
| 682 | field names, the method and attribute names start with an underscore.
|
---|
| 683 |
|
---|
[391] | 684 | .. classmethod:: somenamedtuple._make(iterable)
|
---|
[2] | 685 |
|
---|
| 686 | Class method that makes a new instance from an existing sequence or iterable.
|
---|
| 687 |
|
---|
| 688 | .. doctest::
|
---|
| 689 |
|
---|
| 690 | >>> t = [11, 22]
|
---|
| 691 | >>> Point._make(t)
|
---|
| 692 | Point(x=11, y=22)
|
---|
| 693 |
|
---|
| 694 | .. method:: somenamedtuple._asdict()
|
---|
| 695 |
|
---|
[391] | 696 | Return a new :class:`OrderedDict` which maps field names to their corresponding
|
---|
| 697 | values::
|
---|
[2] | 698 |
|
---|
| 699 | >>> p._asdict()
|
---|
[391] | 700 | OrderedDict([('x', 11), ('y', 22)])
|
---|
[2] | 701 |
|
---|
[391] | 702 | .. versionchanged:: 2.7
|
---|
| 703 | Returns an :class:`OrderedDict` instead of a regular :class:`dict`.
|
---|
| 704 |
|
---|
[2] | 705 | .. method:: somenamedtuple._replace(kwargs)
|
---|
| 706 |
|
---|
| 707 | Return a new instance of the named tuple replacing specified fields with new
|
---|
| 708 | values::
|
---|
| 709 |
|
---|
| 710 | >>> p = Point(x=11, y=22)
|
---|
| 711 | >>> p._replace(x=33)
|
---|
| 712 | Point(x=33, y=22)
|
---|
| 713 |
|
---|
| 714 | >>> for partnum, record in inventory.items():
|
---|
[391] | 715 | inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now())
|
---|
[2] | 716 |
|
---|
| 717 | .. attribute:: somenamedtuple._fields
|
---|
| 718 |
|
---|
| 719 | Tuple of strings listing the field names. Useful for introspection
|
---|
| 720 | and for creating new named tuple types from existing named tuples.
|
---|
| 721 |
|
---|
| 722 | .. doctest::
|
---|
| 723 |
|
---|
| 724 | >>> p._fields # view the field names
|
---|
| 725 | ('x', 'y')
|
---|
| 726 |
|
---|
| 727 | >>> Color = namedtuple('Color', 'red green blue')
|
---|
| 728 | >>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)
|
---|
| 729 | >>> Pixel(11, 22, 128, 255, 0)
|
---|
| 730 | Pixel(x=11, y=22, red=128, green=255, blue=0)
|
---|
| 731 |
|
---|
| 732 | To retrieve a field whose name is stored in a string, use the :func:`getattr`
|
---|
| 733 | function:
|
---|
| 734 |
|
---|
| 735 | >>> getattr(p, 'x')
|
---|
| 736 | 11
|
---|
| 737 |
|
---|
| 738 | To convert a dictionary to a named tuple, use the double-star-operator
|
---|
| 739 | (as described in :ref:`tut-unpacking-arguments`):
|
---|
| 740 |
|
---|
| 741 | >>> d = {'x': 11, 'y': 22}
|
---|
| 742 | >>> Point(**d)
|
---|
| 743 | Point(x=11, y=22)
|
---|
| 744 |
|
---|
| 745 | Since a named tuple is a regular Python class, it is easy to add or change
|
---|
| 746 | functionality with a subclass. Here is how to add a calculated field and
|
---|
| 747 | a fixed-width print format:
|
---|
| 748 |
|
---|
| 749 | >>> class Point(namedtuple('Point', 'x y')):
|
---|
[391] | 750 | __slots__ = ()
|
---|
| 751 | @property
|
---|
| 752 | def hypot(self):
|
---|
| 753 | return (self.x ** 2 + self.y ** 2) ** 0.5
|
---|
| 754 | def __str__(self):
|
---|
| 755 | return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot)
|
---|
[2] | 756 |
|
---|
| 757 | >>> for p in Point(3, 4), Point(14, 5/7.):
|
---|
[391] | 758 | print p
|
---|
[2] | 759 | Point: x= 3.000 y= 4.000 hypot= 5.000
|
---|
| 760 | Point: x=14.000 y= 0.714 hypot=14.018
|
---|
| 761 |
|
---|
[391] | 762 | The subclass shown above sets ``__slots__`` to an empty tuple. This helps
|
---|
[2] | 763 | keep memory requirements low by preventing the creation of instance dictionaries.
|
---|
| 764 |
|
---|
| 765 | Subclassing is not useful for adding new, stored fields. Instead, simply
|
---|
| 766 | create a new named tuple type from the :attr:`_fields` attribute:
|
---|
| 767 |
|
---|
| 768 | >>> Point3D = namedtuple('Point3D', Point._fields + ('z',))
|
---|
| 769 |
|
---|
| 770 | Default values can be implemented by using :meth:`_replace` to
|
---|
| 771 | customize a prototype instance:
|
---|
| 772 |
|
---|
| 773 | >>> Account = namedtuple('Account', 'owner balance transaction_count')
|
---|
| 774 | >>> default_account = Account('<owner name>', 0.0, 0)
|
---|
| 775 | >>> johns_account = default_account._replace(owner='John')
|
---|
| 776 |
|
---|
| 777 | Enumerated constants can be implemented with named tuples, but it is simpler
|
---|
| 778 | and more efficient to use a simple class declaration:
|
---|
| 779 |
|
---|
| 780 | >>> Status = namedtuple('Status', 'open pending closed')._make(range(3))
|
---|
| 781 | >>> Status.open, Status.pending, Status.closed
|
---|
| 782 | (0, 1, 2)
|
---|
| 783 | >>> class Status:
|
---|
[391] | 784 | open, pending, closed = range(3)
|
---|
[2] | 785 |
|
---|
| 786 | .. seealso::
|
---|
| 787 |
|
---|
| 788 | `Named tuple recipe <http://code.activestate.com/recipes/500261/>`_
|
---|
| 789 | adapted for Python 2.4.
|
---|
[391] | 790 |
|
---|
| 791 |
|
---|
| 792 | :class:`OrderedDict` objects
|
---|
| 793 | ----------------------------
|
---|
| 794 |
|
---|
| 795 | Ordered dictionaries are just like regular dictionaries but they remember the
|
---|
| 796 | order that items were inserted. When iterating over an ordered dictionary,
|
---|
| 797 | the items are returned in the order their keys were first added.
|
---|
| 798 |
|
---|
| 799 | .. class:: OrderedDict([items])
|
---|
| 800 |
|
---|
| 801 | Return an instance of a dict subclass, supporting the usual :class:`dict`
|
---|
| 802 | methods. An *OrderedDict* is a dict that remembers the order that keys
|
---|
| 803 | were first inserted. If a new entry overwrites an existing entry, the
|
---|
| 804 | original insertion position is left unchanged. Deleting an entry and
|
---|
| 805 | reinserting it will move it to the end.
|
---|
| 806 |
|
---|
| 807 | .. versionadded:: 2.7
|
---|
| 808 |
|
---|
| 809 | .. method:: OrderedDict.popitem(last=True)
|
---|
| 810 |
|
---|
| 811 | The :meth:`popitem` method for ordered dictionaries returns and removes
|
---|
| 812 | a (key, value) pair. The pairs are returned in LIFO order if *last* is
|
---|
| 813 | true or FIFO order if false.
|
---|
| 814 |
|
---|
| 815 | In addition to the usual mapping methods, ordered dictionaries also support
|
---|
| 816 | reverse iteration using :func:`reversed`.
|
---|
| 817 |
|
---|
| 818 | Equality tests between :class:`OrderedDict` objects are order-sensitive
|
---|
| 819 | and are implemented as ``list(od1.items())==list(od2.items())``.
|
---|
| 820 | Equality tests between :class:`OrderedDict` objects and other
|
---|
| 821 | :class:`Mapping` objects are order-insensitive like regular
|
---|
| 822 | dictionaries. This allows :class:`OrderedDict` objects to be substituted
|
---|
| 823 | anywhere a regular dictionary is used.
|
---|
| 824 |
|
---|
| 825 | The :class:`OrderedDict` constructor and :meth:`update` method both accept
|
---|
| 826 | keyword arguments, but their order is lost because Python's function call
|
---|
| 827 | semantics pass-in keyword arguments using a regular unordered dictionary.
|
---|
| 828 |
|
---|
| 829 | .. seealso::
|
---|
| 830 |
|
---|
| 831 | `Equivalent OrderedDict recipe <http://code.activestate.com/recipes/576693/>`_
|
---|
| 832 | that runs on Python 2.4 or later.
|
---|
| 833 |
|
---|
| 834 | :class:`OrderedDict` Examples and Recipes
|
---|
| 835 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
---|
| 836 |
|
---|
| 837 | Since an ordered dictionary remembers its insertion order, it can be used
|
---|
| 838 | in conjuction with sorting to make a sorted dictionary::
|
---|
| 839 |
|
---|
| 840 | >>> # regular unsorted dictionary
|
---|
| 841 | >>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}
|
---|
| 842 |
|
---|
| 843 | >>> # dictionary sorted by key
|
---|
| 844 | >>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
|
---|
| 845 | OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
|
---|
| 846 |
|
---|
| 847 | >>> # dictionary sorted by value
|
---|
| 848 | >>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
|
---|
| 849 | OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
|
---|
| 850 |
|
---|
| 851 | >>> # dictionary sorted by length of the key string
|
---|
| 852 | >>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
|
---|
| 853 | OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
|
---|
| 854 |
|
---|
| 855 | The new sorted dictionaries maintain their sort order when entries
|
---|
| 856 | are deleted. But when new keys are added, the keys are appended
|
---|
| 857 | to the end and the sort is not maintained.
|
---|
| 858 |
|
---|
| 859 | It is also straight-forward to create an ordered dictionary variant
|
---|
| 860 | that remembers the order the keys were *last* inserted.
|
---|
| 861 | If a new entry overwrites an existing entry, the
|
---|
| 862 | original insertion position is changed and moved to the end::
|
---|
| 863 |
|
---|
| 864 | class LastUpdatedOrderedDict(OrderedDict):
|
---|
| 865 | 'Store items in the order the keys were last added'
|
---|
| 866 |
|
---|
| 867 | def __setitem__(self, key, value):
|
---|
| 868 | if key in self:
|
---|
| 869 | del self[key]
|
---|
| 870 | OrderedDict.__setitem__(self, key, value)
|
---|
| 871 |
|
---|
| 872 | An ordered dictionary can be combined with the :class:`Counter` class
|
---|
| 873 | so that the counter remembers the order elements are first encountered::
|
---|
| 874 |
|
---|
| 875 | class OrderedCounter(Counter, OrderedDict):
|
---|
| 876 | 'Counter that remembers the order elements are first encountered'
|
---|
| 877 |
|
---|
| 878 | def __repr__(self):
|
---|
| 879 | return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))
|
---|
| 880 |
|
---|
| 881 | def __reduce__(self):
|
---|
| 882 | return self.__class__, (OrderedDict(self),)
|
---|
| 883 |
|
---|
| 884 |
|
---|
| 885 | .. _collections-abstract-base-classes:
|
---|
| 886 |
|
---|
| 887 | Collections Abstract Base Classes
|
---|
| 888 | ---------------------------------
|
---|
| 889 |
|
---|
| 890 | The collections module offers the following :term:`ABCs <abstract base class>`:
|
---|
| 891 |
|
---|
| 892 | ========================= ===================== ====================== ====================================================
|
---|
| 893 | ABC Inherits from Abstract Methods Mixin Methods
|
---|
| 894 | ========================= ===================== ====================== ====================================================
|
---|
| 895 | :class:`Container` ``__contains__``
|
---|
| 896 | :class:`Hashable` ``__hash__``
|
---|
| 897 | :class:`Iterable` ``__iter__``
|
---|
| 898 | :class:`Iterator` :class:`Iterable` ``next`` ``__iter__``
|
---|
| 899 | :class:`Sized` ``__len__``
|
---|
| 900 | :class:`Callable` ``__call__``
|
---|
| 901 |
|
---|
| 902 | :class:`Sequence` :class:`Sized`, ``__getitem__``, ``__contains__``, ``__iter__``, ``__reversed__``,
|
---|
| 903 | :class:`Iterable`, ``__len__`` ``index``, and ``count``
|
---|
| 904 | :class:`Container`
|
---|
| 905 |
|
---|
| 906 | :class:`MutableSequence` :class:`Sequence` ``__getitem__``, Inherited :class:`Sequence` methods and
|
---|
| 907 | ``__setitem__``, ``append``, ``reverse``, ``extend``, ``pop``,
|
---|
| 908 | ``__delitem__``, ``remove``, and ``__iadd__``
|
---|
| 909 | ``__len__``,
|
---|
| 910 | ``insert``
|
---|
| 911 |
|
---|
| 912 | :class:`Set` :class:`Sized`, ``__contains__``, ``__le__``, ``__lt__``, ``__eq__``, ``__ne__``,
|
---|
| 913 | :class:`Iterable`, ``__iter__``, ``__gt__``, ``__ge__``, ``__and__``, ``__or__``,
|
---|
| 914 | :class:`Container` ``__len__`` ``__sub__``, ``__xor__``, and ``isdisjoint``
|
---|
| 915 |
|
---|
| 916 | :class:`MutableSet` :class:`Set` ``__contains__``, Inherited :class:`Set` methods and
|
---|
| 917 | ``__iter__``, ``clear``, ``pop``, ``remove``, ``__ior__``,
|
---|
| 918 | ``__len__``, ``__iand__``, ``__ixor__``, and ``__isub__``
|
---|
| 919 | ``add``,
|
---|
| 920 | ``discard``
|
---|
| 921 |
|
---|
| 922 | :class:`Mapping` :class:`Sized`, ``__getitem__``, ``__contains__``, ``keys``, ``items``, ``values``,
|
---|
| 923 | :class:`Iterable`, ``__iter__``, ``get``, ``__eq__``, and ``__ne__``
|
---|
| 924 | :class:`Container` ``__len__``
|
---|
| 925 |
|
---|
| 926 | :class:`MutableMapping` :class:`Mapping` ``__getitem__``, Inherited :class:`Mapping` methods and
|
---|
| 927 | ``__setitem__``, ``pop``, ``popitem``, ``clear``, ``update``,
|
---|
| 928 | ``__delitem__``, and ``setdefault``
|
---|
| 929 | ``__iter__``,
|
---|
| 930 | ``__len__``
|
---|
| 931 |
|
---|
| 932 |
|
---|
| 933 | :class:`MappingView` :class:`Sized` ``__len__``
|
---|
| 934 | :class:`ItemsView` :class:`MappingView`, ``__contains__``,
|
---|
| 935 | :class:`Set` ``__iter__``
|
---|
| 936 | :class:`KeysView` :class:`MappingView`, ``__contains__``,
|
---|
| 937 | :class:`Set` ``__iter__``
|
---|
| 938 | :class:`ValuesView` :class:`MappingView` ``__contains__``, ``__iter__``
|
---|
| 939 | ========================= ===================== ====================== ====================================================
|
---|
| 940 |
|
---|
| 941 |
|
---|
| 942 | .. class:: Container
|
---|
| 943 | Hashable
|
---|
| 944 | Sized
|
---|
| 945 | Callable
|
---|
| 946 |
|
---|
| 947 | ABCs for classes that provide respectively the methods :meth:`__contains__`,
|
---|
| 948 | :meth:`__hash__`, :meth:`__len__`, and :meth:`__call__`.
|
---|
| 949 |
|
---|
| 950 | .. class:: Iterable
|
---|
| 951 |
|
---|
| 952 | ABC for classes that provide the :meth:`__iter__` method.
|
---|
| 953 | See also the definition of :term:`iterable`.
|
---|
| 954 |
|
---|
| 955 | .. class:: Iterator
|
---|
| 956 |
|
---|
| 957 | ABC for classes that provide the :meth:`__iter__` and :meth:`next` methods.
|
---|
| 958 | See also the definition of :term:`iterator`.
|
---|
| 959 |
|
---|
| 960 | .. class:: Sequence
|
---|
| 961 | MutableSequence
|
---|
| 962 |
|
---|
| 963 | ABCs for read-only and mutable :term:`sequences <sequence>`.
|
---|
| 964 |
|
---|
| 965 | .. class:: Set
|
---|
| 966 | MutableSet
|
---|
| 967 |
|
---|
| 968 | ABCs for read-only and mutable sets.
|
---|
| 969 |
|
---|
| 970 | .. class:: Mapping
|
---|
| 971 | MutableMapping
|
---|
| 972 |
|
---|
| 973 | ABCs for read-only and mutable :term:`mappings <mapping>`.
|
---|
| 974 |
|
---|
| 975 | .. class:: MappingView
|
---|
| 976 | ItemsView
|
---|
| 977 | KeysView
|
---|
| 978 | ValuesView
|
---|
| 979 |
|
---|
| 980 | ABCs for mapping, items, keys, and values :term:`views <view>`.
|
---|
| 981 |
|
---|
| 982 |
|
---|
| 983 | These ABCs allow us to ask classes or instances if they provide
|
---|
| 984 | particular functionality, for example::
|
---|
| 985 |
|
---|
| 986 | size = None
|
---|
| 987 | if isinstance(myvar, collections.Sized):
|
---|
| 988 | size = len(myvar)
|
---|
| 989 |
|
---|
| 990 | Several of the ABCs are also useful as mixins that make it easier to develop
|
---|
| 991 | classes supporting container APIs. For example, to write a class supporting
|
---|
| 992 | the full :class:`Set` API, it only necessary to supply the three underlying
|
---|
| 993 | abstract methods: :meth:`__contains__`, :meth:`__iter__`, and :meth:`__len__`.
|
---|
| 994 | The ABC supplies the remaining methods such as :meth:`__and__` and
|
---|
| 995 | :meth:`isdisjoint` ::
|
---|
| 996 |
|
---|
| 997 | class ListBasedSet(collections.Set):
|
---|
| 998 | ''' Alternate set implementation favoring space over speed
|
---|
| 999 | and not requiring the set elements to be hashable. '''
|
---|
| 1000 | def __init__(self, iterable):
|
---|
| 1001 | self.elements = lst = []
|
---|
| 1002 | for value in iterable:
|
---|
| 1003 | if value not in lst:
|
---|
| 1004 | lst.append(value)
|
---|
| 1005 | def __iter__(self):
|
---|
| 1006 | return iter(self.elements)
|
---|
| 1007 | def __contains__(self, value):
|
---|
| 1008 | return value in self.elements
|
---|
| 1009 | def __len__(self):
|
---|
| 1010 | return len(self.elements)
|
---|
| 1011 |
|
---|
| 1012 | s1 = ListBasedSet('abcdef')
|
---|
| 1013 | s2 = ListBasedSet('defghi')
|
---|
| 1014 | overlap = s1 & s2 # The __and__() method is supported automatically
|
---|
| 1015 |
|
---|
| 1016 | Notes on using :class:`Set` and :class:`MutableSet` as a mixin:
|
---|
| 1017 |
|
---|
| 1018 | (1)
|
---|
| 1019 | Since some set operations create new sets, the default mixin methods need
|
---|
| 1020 | a way to create new instances from an iterable. The class constructor is
|
---|
| 1021 | assumed to have a signature in the form ``ClassName(iterable)``.
|
---|
| 1022 | That assumption is factored-out to an internal classmethod called
|
---|
| 1023 | :meth:`_from_iterable` which calls ``cls(iterable)`` to produce a new set.
|
---|
| 1024 | If the :class:`Set` mixin is being used in a class with a different
|
---|
| 1025 | constructor signature, you will need to override :meth:`_from_iterable`
|
---|
| 1026 | with a classmethod that can construct new instances from
|
---|
| 1027 | an iterable argument.
|
---|
| 1028 |
|
---|
| 1029 | (2)
|
---|
| 1030 | To override the comparisons (presumably for speed, as the
|
---|
| 1031 | semantics are fixed), redefine :meth:`__le__` and
|
---|
| 1032 | then the other operations will automatically follow suit.
|
---|
| 1033 |
|
---|
| 1034 | (3)
|
---|
| 1035 | The :class:`Set` mixin provides a :meth:`_hash` method to compute a hash value
|
---|
| 1036 | for the set; however, :meth:`__hash__` is not defined because not all sets
|
---|
| 1037 | are hashable or immutable. To add set hashabilty using mixins,
|
---|
| 1038 | inherit from both :meth:`Set` and :meth:`Hashable`, then define
|
---|
| 1039 | ``__hash__ = Set._hash``.
|
---|
| 1040 |
|
---|
| 1041 | .. seealso::
|
---|
| 1042 |
|
---|
| 1043 | * `OrderedSet recipe <http://code.activestate.com/recipes/576694/>`_ for an
|
---|
| 1044 | example built on :class:`MutableSet`.
|
---|
| 1045 |
|
---|
| 1046 | * For more about ABCs, see the :mod:`abc` module and :pep:`3119`.
|
---|