| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 1 |  | 
 | 2 | :mod:`collections` --- High-performance container datatypes | 
 | 3 | =========================================================== | 
 | 4 |  | 
 | 5 | .. module:: collections | 
 | 6 |    :synopsis: High-performance datatypes | 
 | 7 | .. moduleauthor:: Raymond Hettinger <python@rcn.com> | 
 | 8 | .. sectionauthor:: Raymond Hettinger <python@rcn.com> | 
 | 9 |  | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 10 | .. versionadded:: 2.4 | 
 | 11 |  | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 12 | .. testsetup:: * | 
 | 13 |  | 
 | 14 |    from collections import * | 
 | 15 |    import itertools | 
 | 16 |    __name__ = '<doctest>' | 
 | 17 |  | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 18 | This module implements high-performance container datatypes.  Currently, | 
 | 19 | there are two datatypes, :class:`deque` and :class:`defaultdict`, and | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 20 | one datatype factory function, :func:`namedtuple`. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 21 |  | 
 | 22 | .. versionchanged:: 2.5 | 
 | 23 |    Added :class:`defaultdict`. | 
 | 24 |  | 
 | 25 | .. versionchanged:: 2.6 | 
| Raymond Hettinger | eeeb9c4 | 2007-11-15 02:44:53 +0000 | [diff] [blame] | 26 |    Added :func:`namedtuple`. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 27 |  | 
| Raymond Hettinger | bc4ffc1 | 2008-02-11 23:38:00 +0000 | [diff] [blame] | 28 | The specialized containers provided in this module provide alternatives | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 29 | to Python's general purpose built-in containers, :class:`dict`, | 
| Raymond Hettinger | bc4ffc1 | 2008-02-11 23:38:00 +0000 | [diff] [blame] | 30 | :class:`list`, :class:`set`, and :class:`tuple`. | 
 | 31 |  | 
 | 32 | Besides the containers provided here, the optional :mod:`bsddb` | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 33 | module offers the ability to create in-memory or file based ordered | 
| Raymond Hettinger | bc4ffc1 | 2008-02-11 23:38:00 +0000 | [diff] [blame] | 34 | dictionaries with string keys using the :meth:`bsddb.btopen` method. | 
 | 35 |  | 
 | 36 | In addition to containers, the collections module provides some ABCs | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 37 | (abstract base classes) that can be used to test whether a class | 
| Raymond Hettinger | bc4ffc1 | 2008-02-11 23:38:00 +0000 | [diff] [blame] | 38 | provides a particular interface, for example, is it hashable or | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 39 | a mapping. | 
| Raymond Hettinger | bc4ffc1 | 2008-02-11 23:38:00 +0000 | [diff] [blame] | 40 |  | 
 | 41 | .. versionchanged:: 2.6 | 
 | 42 |    Added abstract base classes. | 
 | 43 |  | 
 | 44 | ABCs - abstract base classes | 
 | 45 | ---------------------------- | 
 | 46 |  | 
 | 47 | The collections module offers the following ABCs: | 
 | 48 |  | 
| Georg Brandl | dbc5987 | 2008-07-08 07:05:23 +0000 | [diff] [blame] | 49 | =========================  =====================  ======================  ==================================================== | 
 | 50 | ABC                        Inherits               Abstract Methods        Mixin Methods | 
 | 51 | =========================  =====================  ======================  ==================================================== | 
 | 52 | :class:`Container`                                ``__contains__`` | 
 | 53 | :class:`Hashable`                                 ``__hash__`` | 
 | 54 | :class:`Iterable`                                 ``__iter__`` | 
 | 55 | :class:`Iterator`          :class:`Iterable`      ``__next__``            ``__iter__`` | 
| Georg Brandl | 7044b11 | 2009-01-03 21:04:55 +0000 | [diff] [blame] | 56 | :class:`Sized`                                    ``__len__`` | 
| Georg Brandl | dbc5987 | 2008-07-08 07:05:23 +0000 | [diff] [blame] | 57 | :class:`Callable`                                 ``__call__`` | 
| Georg Brandl | c62ef8b | 2009-01-03 20:55:06 +0000 | [diff] [blame] | 58 |  | 
| Georg Brandl | dbc5987 | 2008-07-08 07:05:23 +0000 | [diff] [blame] | 59 | :class:`Sequence`          :class:`Sized`,        ``__getitem__``         ``__contains__``. ``__iter__``, ``__reversed__``. | 
 | 60 |                            :class:`Iterable`,     and ``__len__``         ``index``, and ``count`` | 
| Georg Brandl | c62ef8b | 2009-01-03 20:55:06 +0000 | [diff] [blame] | 61 |                            :class:`Container` | 
 | 62 |  | 
| Georg Brandl | df9bcf1 | 2008-11-24 16:16:07 +0000 | [diff] [blame] | 63 | :class:`MutableSequence`   :class:`Sequence`      ``__getitem__``         Inherited Sequence methods and | 
| Georg Brandl | dbc5987 | 2008-07-08 07:05:23 +0000 | [diff] [blame] | 64 |                                                   ``__delitem__``,        ``append``, ``reverse``, ``extend``, ``pop``, | 
 | 65 |                                                   ``insert``,             ``remove``, and ``__iadd__`` | 
 | 66 |                                                   and ``__len__`` | 
| Georg Brandl | c62ef8b | 2009-01-03 20:55:06 +0000 | [diff] [blame] | 67 |  | 
| Georg Brandl | dbc5987 | 2008-07-08 07:05:23 +0000 | [diff] [blame] | 68 | :class:`Set`               :class:`Sized`,        ``__len__``,            ``__le__``, ``__lt__``, ``__eq__``, ``__ne__``, | 
 | 69 |                            :class:`Iterable`,     ``__iter__``, and       ``__gt__``, ``__ge__``, ``__and__``, ``__or__`` | 
 | 70 |                            :class:`Container`     ``__contains__``        ``__sub__``, ``__xor__``, and ``isdisjoint`` | 
| Georg Brandl | c62ef8b | 2009-01-03 20:55:06 +0000 | [diff] [blame] | 71 |  | 
| Georg Brandl | dbc5987 | 2008-07-08 07:05:23 +0000 | [diff] [blame] | 72 | :class:`MutableSet`        :class:`Set`           ``add`` and             Inherited Set methods and | 
 | 73 |                                                   ``discard``             ``clear``, ``pop``, ``remove``, ``__ior__``, | 
 | 74 |                                                                           ``__iand__``, ``__ixor__``, and ``__isub__`` | 
| Georg Brandl | c62ef8b | 2009-01-03 20:55:06 +0000 | [diff] [blame] | 75 |  | 
| Georg Brandl | dbc5987 | 2008-07-08 07:05:23 +0000 | [diff] [blame] | 76 | :class:`Mapping`           :class:`Sized`,        ``__getitem__``,        ``__contains__``, ``keys``, ``items``, ``values``, | 
 | 77 |                            :class:`Iterable`,     ``__len__``. and        ``get``, ``__eq__``, and ``__ne__`` | 
 | 78 |                            :class:`Container`     ``__iter__`` | 
| Georg Brandl | c62ef8b | 2009-01-03 20:55:06 +0000 | [diff] [blame] | 79 |  | 
| Georg Brandl | dbc5987 | 2008-07-08 07:05:23 +0000 | [diff] [blame] | 80 | :class:`MutableMapping`    :class:`Mapping`       ``__getitem__``         Inherited Mapping methods and | 
 | 81 |                                                   ``__setitem__``,        ``pop``, ``popitem``, ``clear``, ``update``, | 
 | 82 |                                                   ``__delitem__``,        and ``setdefault`` | 
| Georg Brandl | 7044b11 | 2009-01-03 21:04:55 +0000 | [diff] [blame] | 83 |                                                   ``__iter__``, and | 
| Georg Brandl | dbc5987 | 2008-07-08 07:05:23 +0000 | [diff] [blame] | 84 |                                                   ``__len__`` | 
| Georg Brandl | c62ef8b | 2009-01-03 20:55:06 +0000 | [diff] [blame] | 85 |  | 
| Georg Brandl | dbc5987 | 2008-07-08 07:05:23 +0000 | [diff] [blame] | 86 | :class:`MappingView`       :class:`Sized`                                 ``__len__`` | 
 | 87 | :class:`KeysView`          :class:`MappingView`,                          ``__contains__``, | 
 | 88 |                            :class:`Set`                                   ``__iter__`` | 
 | 89 | :class:`ItemsView`         :class:`MappingView`,                          ``__contains__``, | 
 | 90 |                            :class:`Set`                                   ``__iter__`` | 
 | 91 | :class:`ValuesView`        :class:`MappingView`                           ``__contains__``, ``__iter__`` | 
 | 92 | =========================  =====================  ======================  ==================================================== | 
| Raymond Hettinger | bc4ffc1 | 2008-02-11 23:38:00 +0000 | [diff] [blame] | 93 |  | 
 | 94 | These ABCs allow us to ask classes or instances if they provide | 
 | 95 | particular functionality, for example:: | 
 | 96 |  | 
 | 97 |     size = None | 
 | 98 |     if isinstance(myvar, collections.Sized): | 
| Georg Brandl | 7044b11 | 2009-01-03 21:04:55 +0000 | [diff] [blame] | 99 |         size = len(myvar) | 
| Raymond Hettinger | bc4ffc1 | 2008-02-11 23:38:00 +0000 | [diff] [blame] | 100 |  | 
 | 101 | Several of the ABCs are also useful as mixins that make it easier to develop | 
 | 102 | classes supporting container APIs.  For example, to write a class supporting | 
 | 103 | the full :class:`Set` API, it only necessary to supply the three underlying | 
 | 104 | abstract methods: :meth:`__contains__`, :meth:`__iter__`, and :meth:`__len__`. | 
 | 105 | The ABC supplies the remaining methods such as :meth:`__and__` and | 
 | 106 | :meth:`isdisjoint` :: | 
 | 107 |  | 
 | 108 |     class ListBasedSet(collections.Set): | 
 | 109 |          ''' Alternate set implementation favoring space over speed | 
 | 110 |              and not requiring the set elements to be hashable. ''' | 
 | 111 |          def __init__(self, iterable): | 
 | 112 |              self.elements = lst = [] | 
 | 113 |              for value in iterable: | 
 | 114 |                  if value not in lst: | 
 | 115 |                      lst.append(value) | 
 | 116 |          def __iter__(self): | 
 | 117 |              return iter(self.elements) | 
 | 118 |          def __contains__(self, value): | 
 | 119 |              return value in self.elements | 
 | 120 |          def __len__(self): | 
 | 121 |              return len(self.elements) | 
 | 122 |  | 
 | 123 |     s1 = ListBasedSet('abcdef') | 
 | 124 |     s2 = ListBasedSet('defghi') | 
 | 125 |     overlap = s1 & s2            # The __and__() method is supported automatically | 
 | 126 |  | 
 | 127 | Notes on using :class:`Set` and :class:`MutableSet` as a mixin: | 
 | 128 |  | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 129 | (1) | 
| Raymond Hettinger | bc4ffc1 | 2008-02-11 23:38:00 +0000 | [diff] [blame] | 130 |    Since some set operations create new sets, the default mixin methods need | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 131 |    a way to create new instances from an iterable. The class constructor is | 
 | 132 |    assumed to have a signature in the form ``ClassName(iterable)``. | 
| Raymond Hettinger | 96b4240 | 2008-05-23 17:34:34 +0000 | [diff] [blame] | 133 |    That assumption is factored-out to an internal classmethod called | 
| Raymond Hettinger | bc4ffc1 | 2008-02-11 23:38:00 +0000 | [diff] [blame] | 134 |    :meth:`_from_iterable` which calls ``cls(iterable)`` to produce a new set. | 
 | 135 |    If the :class:`Set` mixin is being used in a class with a different | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 136 |    constructor signature, you will need to override :meth:`from_iterable` | 
 | 137 |    with a classmethod that can construct new instances from | 
| Raymond Hettinger | bc4ffc1 | 2008-02-11 23:38:00 +0000 | [diff] [blame] | 138 |    an iterable argument. | 
 | 139 |  | 
 | 140 | (2) | 
 | 141 |    To override the comparisons (presumably for speed, as the | 
 | 142 |    semantics are fixed), redefine :meth:`__le__` and | 
 | 143 |    then the other operations will automatically follow suit. | 
 | 144 |  | 
 | 145 | (3) | 
 | 146 |    The :class:`Set` mixin provides a :meth:`_hash` method to compute a hash value | 
 | 147 |    for the set; however, :meth:`__hash__` is not defined because not all sets | 
 | 148 |    are hashable or immutable.  To add set hashabilty using mixins, | 
 | 149 |    inherit from both :meth:`Set` and :meth:`Hashable`, then define | 
 | 150 |    ``__hash__ = Set._hash``. | 
 | 151 |  | 
 | 152 | (For more about ABCs, see the :mod:`abc` module and :pep:`3119`.) | 
 | 153 |  | 
 | 154 |  | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 155 | .. _counter-objects: | 
 | 156 |  | 
 | 157 | :class:`Counter` objects | 
 | 158 | ------------------------ | 
 | 159 |  | 
 | 160 | A counter tool is provided to support convenient and rapid tallies. | 
 | 161 | For example:: | 
 | 162 |  | 
 | 163 |     # Tally repeated words in a list | 
| Raymond Hettinger | aaa6e63 | 2009-01-13 01:05:03 +0000 | [diff] [blame] | 164 |     >>> words = ['red', 'blue', 'red', 'green', 'blue', 'blue'] | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 165 |     >>> cnt = Counter() | 
 | 166 |     >>> for word in words: | 
 | 167 |     ...     cnt[word] += 1 | 
 | 168 |     >>> cnt | 
| Raymond Hettinger | aaa6e63 | 2009-01-13 01:05:03 +0000 | [diff] [blame] | 169 |     Counter({'blue': 3, 'red': 2, 'green': 1}) | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 170 |  | 
 | 171 |     # Find the ten most common words in Hamlet | 
 | 172 |     >>> import re | 
 | 173 |     >>> words = re.findall('\w+', open('hamlet.txt').read().lower()) | 
 | 174 |     >>> Counter(hamlet_words).most_common(10) | 
 | 175 |     [('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631), | 
 | 176 |      ('you', 554),  ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)] | 
 | 177 |  | 
| Raymond Hettinger | 8278385 | 2009-01-13 03:49:43 +0000 | [diff] [blame] | 178 | .. class:: Counter([iterable-or-mapping]) | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 179 |  | 
 | 180 |    A :class:`Counter` is a :class:`dict` subclass for counting hashable items. | 
| Raymond Hettinger | aaa6e63 | 2009-01-13 01:05:03 +0000 | [diff] [blame] | 181 |    It is an unordered collection where elements are stored as dictionary keys | 
 | 182 |    and their counts are stored as dictionary values.  Counts are allowed to be | 
 | 183 |    any integer value including zero or negative counts.  The :class:`Counter` | 
 | 184 |    class is similar to bags or multisets in other languages. | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 185 |  | 
| Raymond Hettinger | 8278385 | 2009-01-13 03:49:43 +0000 | [diff] [blame] | 186 |    Elements are counted from an *iterable* or initialized from another | 
 | 187 |    *mapping* (or counter):: | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 188 |  | 
 | 189 |        >>> c = Counter()                            # a new, empty counter | 
 | 190 |        >>> c = Counter('gallahad')                  # a new counter from an iterable | 
| Raymond Hettinger | 5989412 | 2009-01-14 00:15:21 +0000 | [diff] [blame] | 191 |        >>> c = Counter({'red': 4, 'blue': 2})       # a new counter from a mapping | 
| Raymond Hettinger | bad1eb2 | 2009-01-20 01:19:26 +0000 | [diff] [blame^] | 192 |        >>> c = Counter(spam=8, eggs=1)              # a new counter from keyword args | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 193 |  | 
 | 194 |    The returned object has a dictionary style interface except that it returns | 
 | 195 |    a zero count for missing items (instead of raising a :exc:`KeyError` like a | 
 | 196 |    dictionary would):: | 
 | 197 |  | 
| Raymond Hettinger | 5989412 | 2009-01-14 00:15:21 +0000 | [diff] [blame] | 198 |         >>> c = Counter(['egg', 'ham']) | 
 | 199 |         >>> c['bacon']                              # count of a missing element is zero | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 200 |         0 | 
 | 201 |  | 
 | 202 |    Assigning a count of zero or reducing the count to zero leaves the | 
 | 203 |    element in the dictionary.  Use ``del`` to remove the entry entirely: | 
 | 204 |  | 
 | 205 |         >>> c = Counter(['arthur', 'gwain']) | 
| Raymond Hettinger | 5989412 | 2009-01-14 00:15:21 +0000 | [diff] [blame] | 206 |         >>> c['arthur'] = 0                         # set the count of 'arthur' to zero | 
 | 207 |         >>> 'arthur' in c                           # but 'arthur' is still in the counter | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 208 |         True | 
 | 209 |         >>> del c['arthur']                         # del will completely remove the entry | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 210 |  | 
 | 211 |    .. versionadded:: 2.7 | 
 | 212 |  | 
 | 213 |  | 
 | 214 |    Counter objects support two methods beyond those available for all | 
 | 215 |    dictionaries: | 
 | 216 |  | 
 | 217 |    .. method:: elements() | 
 | 218 |  | 
 | 219 |       Return an iterator over elements repeating each as many times as its count. | 
 | 220 |       Elements are returned in arbitrary order.  If an element's count has been | 
 | 221 |       set to zero or a negative number, :meth:`elements` will ignore it. | 
 | 222 |  | 
| Raymond Hettinger | bad1eb2 | 2009-01-20 01:19:26 +0000 | [diff] [blame^] | 223 |             >>> c =  Counter(a=4, b=2, c=0, d=-2) | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 224 |             >>> list(c.elements()) | 
 | 225 |             ['a', 'a', 'a', 'a', 'b', 'b'] | 
 | 226 |  | 
 | 227 |    .. method:: most_common([n]) | 
 | 228 |  | 
 | 229 |       Return a list of the *n* most common elements and their counts from | 
 | 230 |       the most common to the least.  If *n* is not specified or is ``None``, | 
 | 231 |       return a list of all element counts in decreasing order of frequency. | 
 | 232 |       Elements with equal counts are ordered arbitrarily:: | 
 | 233 |  | 
 | 234 |             >>> Counter('abracadabra').most_common(3) | 
 | 235 |             [('a', 5), ('r', 2), ('b', 2)] | 
 | 236 |  | 
 | 237 |    The usual dictionary methods are available for :class:`Counter` objects. | 
 | 238 |    All of those work the same as they do for dictionaries except for two | 
 | 239 |    which work differently for counters. | 
 | 240 |  | 
 | 241 |    .. method:: fromkeys(iterable) | 
 | 242 |  | 
 | 243 |        There is no equivalent class method for :class:`Counter` objects. | 
 | 244 |        Raises a :exc:`NotImplementedError` when called. | 
 | 245 |  | 
| Raymond Hettinger | 8278385 | 2009-01-13 03:49:43 +0000 | [diff] [blame] | 246 |    .. method:: update([iterable-or-mapping]) | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 247 |  | 
| Raymond Hettinger | 8278385 | 2009-01-13 03:49:43 +0000 | [diff] [blame] | 248 |        Elements are counted from an *iterable* or added-in from another | 
| Raymond Hettinger | bad1eb2 | 2009-01-20 01:19:26 +0000 | [diff] [blame^] | 249 |        *mapping* (or counter).  Like :meth:`dict.update` but adds-in counts | 
 | 250 |        instead of replacing them, and the *iterable* is expected to be a | 
 | 251 |        sequence of elements, not a sequence of ``(key, value)`` pairs:: | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 252 |  | 
| Raymond Hettinger | 8278385 | 2009-01-13 03:49:43 +0000 | [diff] [blame] | 253 |             >>> c = Counter('which') | 
 | 254 |             >>> c.update('witch')           # add elements from another iterable | 
 | 255 |             >>> d = Counter('watch') | 
 | 256 |             >>> c.update(d)                 # add elements from another counter | 
 | 257 |             >>> c['h']                      # four 'h' in which, witch, and watch | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 258 |             4 | 
 | 259 |  | 
| Raymond Hettinger | fbcf749 | 2009-01-13 08:38:14 +0000 | [diff] [blame] | 260 | Common patterns for working with :class:`Counter` objects:: | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 261 |  | 
| Raymond Hettinger | fbcf749 | 2009-01-13 08:38:14 +0000 | [diff] [blame] | 262 |     sum(c.values())               # total of all counts | 
 | 263 |     c.clear()                     # reset all counts | 
 | 264 |     list(c)                       # list unique elements | 
 | 265 |     set(c)                        # convert to a set | 
 | 266 |     dict(c)                       # convert to a regular dictionary | 
 | 267 |     c.items()                     # convert to a list of (elem, cnt) pairs | 
 | 268 |     Counter(dict(list_of_pairs))  # convert from a list of (elem, cnt) pairs | 
| Raymond Hettinger | 5989412 | 2009-01-14 00:15:21 +0000 | [diff] [blame] | 269 |     c.most_common()[:-n:-1]       # n least common elements | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 270 |  | 
| Raymond Hettinger | bad1eb2 | 2009-01-20 01:19:26 +0000 | [diff] [blame^] | 271 | Several multiset mathematical operations are provided for combining | 
 | 272 | :class:`Counter` objects.  Multisets are like regular sets but allowed to | 
 | 273 | contain repeated elements (with counts of one or more).  Addition and | 
 | 274 | subtraction combine counters by adding or subtracting the counts of | 
 | 275 | corresponding elements.  Intersection and union return the minimum and maximum | 
 | 276 | of corresponding counts:: | 
 | 277 |  | 
 | 278 |     >>> c = Counter('a': 3, 'b': 1}) | 
 | 279 |     >>> d = Counter({'a': 1, 'b': 2}) | 
 | 280 |     >>> c + d                           # add two counters together:  c[x] + d[x] | 
 | 281 |     Counter({'a': 4, 'b': 3}) | 
 | 282 |     >>> c - d                           # subtract (keeping only positive counts) | 
 | 283 |     Counter({'a': 2}) | 
 | 284 |     >>> c & d                           # interection:  min(c[x], d[x]) | 
 | 285 |     Counter({'a': 1, 'b': 1}) | 
 | 286 |     >>> c | d                           # union:  max(c[x], d[x]) | 
 | 287 |     Counter({'a': 3, 'b': 2}) | 
 | 288 |  | 
 | 289 | All four multiset operations produce only positive counts (negative and zero | 
 | 290 | results are skipped). If inputs include negative counts, addition will sum | 
 | 291 | both counts and then exclude non-positive results.  The other three operations | 
 | 292 | are undefined for negative inputs:: | 
 | 293 |  | 
 | 294 |     >>> e = Counter(a=8, b=-2, c=0) | 
 | 295 |     >>> e += Counter()                  # remove zero and negative counts | 
 | 296 |     >>> e | 
 | 297 |     Counter({'a': 8}) | 
 | 298 |  | 
| Raymond Hettinger | fbcf749 | 2009-01-13 08:38:14 +0000 | [diff] [blame] | 299 | **References**: | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 300 |  | 
| Raymond Hettinger | 5989412 | 2009-01-14 00:15:21 +0000 | [diff] [blame] | 301 | * Wikipedia entry for `Multisets <http://en.wikipedia.org/wiki/Multiset>`_ | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 302 |  | 
| Raymond Hettinger | 5989412 | 2009-01-14 00:15:21 +0000 | [diff] [blame] | 303 | * `Bag class <http://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html>`_ | 
 | 304 |   in Smalltalk | 
 | 305 | * `C++ multisets <http://www.demo2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm>`_ | 
 | 306 |   tutorial with standalone examples | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 307 |  | 
| Raymond Hettinger | 5989412 | 2009-01-14 00:15:21 +0000 | [diff] [blame] | 308 | * An early Python `Bag <http://code.activestate.com/recipes/259174/>`_ recipe | 
 | 309 |   for Python 2.4 and a `Counter <http://code.activestate.com/recipes/576611/>`_ | 
 | 310 |   comformant recipe for Python 2.5 and later | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 311 |  | 
| Raymond Hettinger | 5989412 | 2009-01-14 00:15:21 +0000 | [diff] [blame] | 312 | * Use cases for multisets and mathematical operations on multisets. | 
 | 313 |    Knuth, Donald. The Art of Computer Programming Volume II, | 
 | 314 |    Section 4.6.3, Exercise 19 | 
| Raymond Hettinger | fbcf749 | 2009-01-13 08:38:14 +0000 | [diff] [blame] | 315 |  | 
| Raymond Hettinger | f94d7fa | 2009-01-12 22:58:41 +0000 | [diff] [blame] | 316 |  | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 317 |  | 
 | 318 | .. _deque-objects: | 
 | 319 |  | 
 | 320 | :class:`deque` objects | 
 | 321 | ---------------------- | 
 | 322 |  | 
 | 323 |  | 
| Raymond Hettinger | a7fc4b1 | 2007-10-05 02:47:07 +0000 | [diff] [blame] | 324 | .. class:: deque([iterable[, maxlen]]) | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 325 |  | 
 | 326 |    Returns a new deque object initialized left-to-right (using :meth:`append`) with | 
 | 327 |    data from *iterable*.  If *iterable* is not specified, the new deque is empty. | 
 | 328 |  | 
 | 329 |    Deques are a generalization of stacks and queues (the name is pronounced "deck" | 
 | 330 |    and is short for "double-ended queue").  Deques support thread-safe, memory | 
 | 331 |    efficient appends and pops from either side of the deque with approximately the | 
 | 332 |    same O(1) performance in either direction. | 
 | 333 |  | 
 | 334 |    Though :class:`list` objects support similar operations, they are optimized for | 
 | 335 |    fast fixed-length operations and incur O(n) memory movement costs for | 
 | 336 |    ``pop(0)`` and ``insert(0, v)`` operations which change both the size and | 
 | 337 |    position of the underlying data representation. | 
 | 338 |  | 
 | 339 |    .. versionadded:: 2.4 | 
 | 340 |  | 
| Raymond Hettinger | 6899586 | 2007-10-10 00:26:46 +0000 | [diff] [blame] | 341 |    If *maxlen* is not specified or is *None*, deques may grow to an | 
| Raymond Hettinger | a7fc4b1 | 2007-10-05 02:47:07 +0000 | [diff] [blame] | 342 |    arbitrary length.  Otherwise, the deque is bounded to the specified maximum | 
 | 343 |    length.  Once a bounded length deque is full, when new items are added, a | 
 | 344 |    corresponding number of items are discarded from the opposite end.  Bounded | 
 | 345 |    length deques provide functionality similar to the ``tail`` filter in | 
 | 346 |    Unix. They are also useful for tracking transactions and other pools of data | 
 | 347 |    where only the most recent activity is of interest. | 
 | 348 |  | 
 | 349 |    .. versionchanged:: 2.6 | 
| Georg Brandl | b19be57 | 2007-12-29 10:57:00 +0000 | [diff] [blame] | 350 |       Added *maxlen* parameter. | 
| Raymond Hettinger | a7fc4b1 | 2007-10-05 02:47:07 +0000 | [diff] [blame] | 351 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 352 |    Deque objects support the following methods: | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 353 |  | 
 | 354 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 355 |    .. method:: append(x) | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 356 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 357 |       Add *x* to the right side of the deque. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 358 |  | 
 | 359 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 360 |    .. method:: appendleft(x) | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 361 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 362 |       Add *x* to the left side of the deque. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 363 |  | 
 | 364 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 365 |    .. method:: clear() | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 366 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 367 |       Remove all elements from the deque leaving it with length 0. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 368 |  | 
 | 369 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 370 |    .. method:: extend(iterable) | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 371 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 372 |       Extend the right side of the deque by appending elements from the iterable | 
 | 373 |       argument. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 374 |  | 
 | 375 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 376 |    .. method:: extendleft(iterable) | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 377 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 378 |       Extend the left side of the deque by appending elements from *iterable*. | 
 | 379 |       Note, the series of left appends results in reversing the order of | 
 | 380 |       elements in the iterable argument. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 381 |  | 
 | 382 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 383 |    .. method:: pop() | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 384 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 385 |       Remove and return an element from the right side of the deque. If no | 
 | 386 |       elements are present, raises an :exc:`IndexError`. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 387 |  | 
 | 388 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 389 |    .. method:: popleft() | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 390 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 391 |       Remove and return an element from the left side of the deque. If no | 
 | 392 |       elements are present, raises an :exc:`IndexError`. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 393 |  | 
 | 394 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 395 |    .. method:: remove(value) | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 396 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 397 |       Removed the first occurrence of *value*.  If not found, raises a | 
 | 398 |       :exc:`ValueError`. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 399 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 400 |       .. versionadded:: 2.5 | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 401 |  | 
 | 402 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 403 |    .. method:: rotate(n) | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 404 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 405 |       Rotate the deque *n* steps to the right.  If *n* is negative, rotate to | 
 | 406 |       the left.  Rotating one step to the right is equivalent to: | 
 | 407 |       ``d.appendleft(d.pop())``. | 
 | 408 |  | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 409 |  | 
 | 410 | In addition to the above, deques support iteration, pickling, ``len(d)``, | 
 | 411 | ``reversed(d)``, ``copy.copy(d)``, ``copy.deepcopy(d)``, membership testing with | 
| Benjamin Peterson | 5c4e006 | 2008-10-16 18:52:14 +0000 | [diff] [blame] | 412 | the :keyword:`in` operator, and subscript references such as ``d[-1]``.  Indexed | 
 | 413 | access is O(1) at both ends but slows to O(n) in the middle.  For fast random | 
 | 414 | access, use lists instead. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 415 |  | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 416 | Example: | 
 | 417 |  | 
 | 418 | .. doctest:: | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 419 |  | 
 | 420 |    >>> from collections import deque | 
 | 421 |    >>> d = deque('ghi')                 # make a new deque with three items | 
 | 422 |    >>> for elem in d:                   # iterate over the deque's elements | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 423 |    ...     print elem.upper() | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 424 |    G | 
 | 425 |    H | 
 | 426 |    I | 
 | 427 |  | 
 | 428 |    >>> d.append('j')                    # add a new entry to the right side | 
 | 429 |    >>> d.appendleft('f')                # add a new entry to the left side | 
 | 430 |    >>> d                                # show the representation of the deque | 
 | 431 |    deque(['f', 'g', 'h', 'i', 'j']) | 
 | 432 |  | 
 | 433 |    >>> d.pop()                          # return and remove the rightmost item | 
 | 434 |    'j' | 
 | 435 |    >>> d.popleft()                      # return and remove the leftmost item | 
 | 436 |    'f' | 
 | 437 |    >>> list(d)                          # list the contents of the deque | 
 | 438 |    ['g', 'h', 'i'] | 
 | 439 |    >>> d[0]                             # peek at leftmost item | 
 | 440 |    'g' | 
 | 441 |    >>> d[-1]                            # peek at rightmost item | 
 | 442 |    'i' | 
 | 443 |  | 
 | 444 |    >>> list(reversed(d))                # list the contents of a deque in reverse | 
 | 445 |    ['i', 'h', 'g'] | 
 | 446 |    >>> 'h' in d                         # search the deque | 
 | 447 |    True | 
 | 448 |    >>> d.extend('jkl')                  # add multiple elements at once | 
 | 449 |    >>> d | 
 | 450 |    deque(['g', 'h', 'i', 'j', 'k', 'l']) | 
 | 451 |    >>> d.rotate(1)                      # right rotation | 
 | 452 |    >>> d | 
 | 453 |    deque(['l', 'g', 'h', 'i', 'j', 'k']) | 
 | 454 |    >>> d.rotate(-1)                     # left rotation | 
 | 455 |    >>> d | 
 | 456 |    deque(['g', 'h', 'i', 'j', 'k', 'l']) | 
 | 457 |  | 
 | 458 |    >>> deque(reversed(d))               # make a new deque in reverse order | 
 | 459 |    deque(['l', 'k', 'j', 'i', 'h', 'g']) | 
 | 460 |    >>> d.clear()                        # empty the deque | 
 | 461 |    >>> d.pop()                          # cannot pop from an empty deque | 
 | 462 |    Traceback (most recent call last): | 
 | 463 |      File "<pyshell#6>", line 1, in -toplevel- | 
 | 464 |        d.pop() | 
 | 465 |    IndexError: pop from an empty deque | 
 | 466 |  | 
 | 467 |    >>> d.extendleft('abc')              # extendleft() reverses the input order | 
 | 468 |    >>> d | 
 | 469 |    deque(['c', 'b', 'a']) | 
 | 470 |  | 
 | 471 |  | 
 | 472 | .. _deque-recipes: | 
 | 473 |  | 
| Raymond Hettinger | a7fc4b1 | 2007-10-05 02:47:07 +0000 | [diff] [blame] | 474 | :class:`deque` Recipes | 
 | 475 | ^^^^^^^^^^^^^^^^^^^^^^ | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 476 |  | 
 | 477 | This section shows various approaches to working with deques. | 
 | 478 |  | 
 | 479 | The :meth:`rotate` method provides a way to implement :class:`deque` slicing and | 
 | 480 | deletion.  For example, a pure python implementation of ``del d[n]`` relies on | 
 | 481 | the :meth:`rotate` method to position elements to be popped:: | 
 | 482 |  | 
 | 483 |    def delete_nth(d, n): | 
 | 484 |        d.rotate(-n) | 
 | 485 |        d.popleft() | 
 | 486 |        d.rotate(n) | 
 | 487 |  | 
 | 488 | To implement :class:`deque` slicing, use a similar approach applying | 
 | 489 | :meth:`rotate` to bring a target element to the left side of the deque. Remove | 
 | 490 | old entries with :meth:`popleft`, add new entries with :meth:`extend`, and then | 
 | 491 | reverse the rotation. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 492 | With minor variations on that approach, it is easy to implement Forth style | 
 | 493 | stack manipulations such as ``dup``, ``drop``, ``swap``, ``over``, ``pick``, | 
 | 494 | ``rot``, and ``roll``. | 
 | 495 |  | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 496 | Multi-pass data reduction algorithms can be succinctly expressed and efficiently | 
 | 497 | coded by extracting elements with multiple calls to :meth:`popleft`, applying | 
| Raymond Hettinger | a7fc4b1 | 2007-10-05 02:47:07 +0000 | [diff] [blame] | 498 | a reduction function, and calling :meth:`append` to add the result back to the | 
 | 499 | deque. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 500 |  | 
 | 501 | For example, building a balanced binary tree of nested lists entails reducing | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 502 | two adjacent nodes into one by grouping them in a list: | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 503 |  | 
 | 504 |    >>> def maketree(iterable): | 
 | 505 |    ...     d = deque(iterable) | 
 | 506 |    ...     while len(d) > 1: | 
 | 507 |    ...         pair = [d.popleft(), d.popleft()] | 
 | 508 |    ...         d.append(pair) | 
 | 509 |    ...     return list(d) | 
 | 510 |    ... | 
 | 511 |    >>> print maketree('abcdefgh') | 
 | 512 |    [[[['a', 'b'], ['c', 'd']], [['e', 'f'], ['g', 'h']]]] | 
 | 513 |  | 
| Raymond Hettinger | a7fc4b1 | 2007-10-05 02:47:07 +0000 | [diff] [blame] | 514 | Bounded length deques provide functionality similar to the ``tail`` filter | 
 | 515 | in Unix:: | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 516 |  | 
| Raymond Hettinger | a7fc4b1 | 2007-10-05 02:47:07 +0000 | [diff] [blame] | 517 |    def tail(filename, n=10): | 
 | 518 |        'Return the last n lines of a file' | 
 | 519 |        return deque(open(filename), n) | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 520 |  | 
 | 521 | .. _defaultdict-objects: | 
 | 522 |  | 
 | 523 | :class:`defaultdict` objects | 
 | 524 | ---------------------------- | 
 | 525 |  | 
 | 526 |  | 
 | 527 | .. class:: defaultdict([default_factory[, ...]]) | 
 | 528 |  | 
 | 529 |    Returns a new dictionary-like object.  :class:`defaultdict` is a subclass of the | 
 | 530 |    builtin :class:`dict` class.  It overrides one method and adds one writable | 
 | 531 |    instance variable.  The remaining functionality is the same as for the | 
 | 532 |    :class:`dict` class and is not documented here. | 
 | 533 |  | 
 | 534 |    The first argument provides the initial value for the :attr:`default_factory` | 
 | 535 |    attribute; it defaults to ``None``. All remaining arguments are treated the same | 
 | 536 |    as if they were passed to the :class:`dict` constructor, including keyword | 
 | 537 |    arguments. | 
 | 538 |  | 
 | 539 |    .. versionadded:: 2.5 | 
 | 540 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 541 |    :class:`defaultdict` objects support the following method in addition to the | 
 | 542 |    standard :class:`dict` operations: | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 543 |  | 
 | 544 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 545 |    .. method:: defaultdict.__missing__(key) | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 546 |  | 
| Skip Montanaro | b40890d | 2008-09-17 11:50:36 +0000 | [diff] [blame] | 547 |       If the :attr:`default_factory` attribute is ``None``, this raises a | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 548 |       :exc:`KeyError` exception with the *key* as argument. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 549 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 550 |       If :attr:`default_factory` is not ``None``, it is called without arguments | 
 | 551 |       to provide a default value for the given *key*, this value is inserted in | 
 | 552 |       the dictionary for the *key*, and returned. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 553 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 554 |       If calling :attr:`default_factory` raises an exception this exception is | 
 | 555 |       propagated unchanged. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 556 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 557 |       This method is called by the :meth:`__getitem__` method of the | 
 | 558 |       :class:`dict` class when the requested key is not found; whatever it | 
 | 559 |       returns or raises is then returned or raised by :meth:`__getitem__`. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 560 |  | 
 | 561 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 562 |    :class:`defaultdict` objects support the following instance variable: | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 563 |  | 
| Benjamin Peterson | c7b0592 | 2008-04-25 01:29:10 +0000 | [diff] [blame] | 564 |  | 
 | 565 |    .. attribute:: defaultdict.default_factory | 
 | 566 |  | 
 | 567 |       This attribute is used by the :meth:`__missing__` method; it is | 
 | 568 |       initialized from the first argument to the constructor, if present, or to | 
 | 569 |       ``None``, if absent. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 570 |  | 
 | 571 |  | 
 | 572 | .. _defaultdict-examples: | 
 | 573 |  | 
 | 574 | :class:`defaultdict` Examples | 
 | 575 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
 | 576 |  | 
 | 577 | Using :class:`list` as the :attr:`default_factory`, it is easy to group a | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 578 | sequence of key-value pairs into a dictionary of lists: | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 579 |  | 
 | 580 |    >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] | 
 | 581 |    >>> d = defaultdict(list) | 
 | 582 |    >>> for k, v in s: | 
 | 583 |    ...     d[k].append(v) | 
 | 584 |    ... | 
 | 585 |    >>> d.items() | 
 | 586 |    [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] | 
 | 587 |  | 
 | 588 | When each key is encountered for the first time, it is not already in the | 
 | 589 | mapping; so an entry is automatically created using the :attr:`default_factory` | 
 | 590 | function which returns an empty :class:`list`.  The :meth:`list.append` | 
 | 591 | operation then attaches the value to the new list.  When keys are encountered | 
 | 592 | again, the look-up proceeds normally (returning the list for that key) and the | 
 | 593 | :meth:`list.append` operation adds another value to the list. This technique is | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 594 | simpler and faster than an equivalent technique using :meth:`dict.setdefault`: | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 595 |  | 
 | 596 |    >>> d = {} | 
 | 597 |    >>> for k, v in s: | 
 | 598 |    ...     d.setdefault(k, []).append(v) | 
 | 599 |    ... | 
 | 600 |    >>> d.items() | 
 | 601 |    [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] | 
 | 602 |  | 
 | 603 | Setting the :attr:`default_factory` to :class:`int` makes the | 
 | 604 | :class:`defaultdict` useful for counting (like a bag or multiset in other | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 605 | languages): | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 606 |  | 
 | 607 |    >>> s = 'mississippi' | 
 | 608 |    >>> d = defaultdict(int) | 
 | 609 |    >>> for k in s: | 
 | 610 |    ...     d[k] += 1 | 
 | 611 |    ... | 
 | 612 |    >>> d.items() | 
 | 613 |    [('i', 4), ('p', 2), ('s', 4), ('m', 1)] | 
 | 614 |  | 
 | 615 | When a letter is first encountered, it is missing from the mapping, so the | 
 | 616 | :attr:`default_factory` function calls :func:`int` to supply a default count of | 
 | 617 | zero.  The increment operation then builds up the count for each letter. | 
 | 618 |  | 
 | 619 | The function :func:`int` which always returns zero is just a special case of | 
 | 620 | constant functions.  A faster and more flexible way to create constant functions | 
 | 621 | is to use :func:`itertools.repeat` which can supply any constant value (not just | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 622 | zero): | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 623 |  | 
 | 624 |    >>> def constant_factory(value): | 
 | 625 |    ...     return itertools.repeat(value).next | 
 | 626 |    >>> d = defaultdict(constant_factory('<missing>')) | 
 | 627 |    >>> d.update(name='John', action='ran') | 
 | 628 |    >>> '%(name)s %(action)s to %(object)s' % d | 
 | 629 |    'John ran to <missing>' | 
 | 630 |  | 
 | 631 | Setting the :attr:`default_factory` to :class:`set` makes the | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 632 | :class:`defaultdict` useful for building a dictionary of sets: | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 633 |  | 
 | 634 |    >>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)] | 
 | 635 |    >>> d = defaultdict(set) | 
 | 636 |    >>> for k, v in s: | 
 | 637 |    ...     d[k].add(v) | 
 | 638 |    ... | 
 | 639 |    >>> d.items() | 
 | 640 |    [('blue', set([2, 4])), ('red', set([1, 3]))] | 
 | 641 |  | 
 | 642 |  | 
 | 643 | .. _named-tuple-factory: | 
 | 644 |  | 
| Raymond Hettinger | eeeb9c4 | 2007-11-15 02:44:53 +0000 | [diff] [blame] | 645 | :func:`namedtuple` Factory Function for Tuples with Named Fields | 
| Georg Brandl | b3255ed | 2008-01-07 16:43:47 +0000 | [diff] [blame] | 646 | ---------------------------------------------------------------- | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 647 |  | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 648 | Named tuples assign meaning to each position in a tuple and allow for more readable, | 
 | 649 | self-documenting code.  They can be used wherever regular tuples are used, and | 
 | 650 | they add the ability to access fields by name instead of position index. | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 651 |  | 
| Georg Brandl | 061d2e2 | 2008-11-23 19:17:25 +0000 | [diff] [blame] | 652 | .. function:: namedtuple(typename, field_names, [verbose]) | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 653 |  | 
 | 654 |    Returns a new tuple subclass named *typename*.  The new subclass is used to | 
| Georg Brandl | 907a720 | 2008-02-22 12:31:45 +0000 | [diff] [blame] | 655 |    create tuple-like objects that have fields accessible by attribute lookup as | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 656 |    well as being indexable and iterable.  Instances of the subclass also have a | 
| Georg Brandl | 061d2e2 | 2008-11-23 19:17:25 +0000 | [diff] [blame] | 657 |    helpful docstring (with typename and field_names) and a helpful :meth:`__repr__` | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 658 |    method which lists the tuple contents in a ``name=value`` format. | 
 | 659 |  | 
| Georg Brandl | 061d2e2 | 2008-11-23 19:17:25 +0000 | [diff] [blame] | 660 |    The *field_names* are a single string with each fieldname separated by whitespace | 
 | 661 |    and/or commas, for example ``'x y'`` or ``'x, y'``.  Alternatively, *field_names* | 
| Raymond Hettinger | 15b5e55 | 2008-01-10 23:00:01 +0000 | [diff] [blame] | 662 |    can be a sequence of strings such as ``['x', 'y']``. | 
| Raymond Hettinger | abfd8df | 2007-10-16 21:28:32 +0000 | [diff] [blame] | 663 |  | 
 | 664 |    Any valid Python identifier may be used for a fieldname except for names | 
| Raymond Hettinger | 42da874 | 2007-12-14 02:49:47 +0000 | [diff] [blame] | 665 |    starting with an underscore.  Valid identifiers consist of letters, digits, | 
 | 666 |    and underscores but do not start with a digit or underscore and cannot be | 
| Raymond Hettinger | abfd8df | 2007-10-16 21:28:32 +0000 | [diff] [blame] | 667 |    a :mod:`keyword` such as *class*, *for*, *return*, *global*, *pass*, *print*, | 
 | 668 |    or *raise*. | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 669 |  | 
| Raymond Hettinger | 15b5e55 | 2008-01-10 23:00:01 +0000 | [diff] [blame] | 670 |    If *verbose* is true, the class definition is printed just before being built. | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 671 |  | 
| Raymond Hettinger | a48a299 | 2007-10-08 21:26:58 +0000 | [diff] [blame] | 672 |    Named tuple instances do not have per-instance dictionaries, so they are | 
| Raymond Hettinger | 7268e9d | 2007-09-20 03:03:43 +0000 | [diff] [blame] | 673 |    lightweight and require no more memory than regular tuples. | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 674 |  | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 675 |    .. versionadded:: 2.6 | 
 | 676 |  | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 677 | Example: | 
 | 678 |  | 
 | 679 | .. doctest:: | 
 | 680 |    :options: +NORMALIZE_WHITESPACE | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 681 |  | 
| Raymond Hettinger | eeeb9c4 | 2007-11-15 02:44:53 +0000 | [diff] [blame] | 682 |    >>> Point = namedtuple('Point', 'x y', verbose=True) | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 683 |    class Point(tuple): | 
 | 684 |            'Point(x, y)' | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 685 |    <BLANKLINE> | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 686 |            __slots__ = () | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 687 |    <BLANKLINE> | 
| Raymond Hettinger | e0734e7 | 2008-01-04 03:22:53 +0000 | [diff] [blame] | 688 |            _fields = ('x', 'y') | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 689 |    <BLANKLINE> | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 690 |            def __new__(cls, x, y): | 
 | 691 |                return tuple.__new__(cls, (x, y)) | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 692 |    <BLANKLINE> | 
| Raymond Hettinger | 02740f7 | 2008-01-05 01:35:43 +0000 | [diff] [blame] | 693 |            @classmethod | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 694 |            def _make(cls, iterable, new=tuple.__new__, len=len): | 
| Raymond Hettinger | 02740f7 | 2008-01-05 01:35:43 +0000 | [diff] [blame] | 695 |                'Make a new Point object from a sequence or iterable' | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 696 |                result = new(cls, iterable) | 
| Raymond Hettinger | 02740f7 | 2008-01-05 01:35:43 +0000 | [diff] [blame] | 697 |                if len(result) != 2: | 
 | 698 |                    raise TypeError('Expected 2 arguments, got %d' % len(result)) | 
 | 699 |                return result | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 700 |    <BLANKLINE> | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 701 |            def __repr__(self): | 
 | 702 |                return 'Point(x=%r, y=%r)' % self | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 703 |    <BLANKLINE> | 
| Raymond Hettinger | 8777bca | 2007-12-18 22:21:27 +0000 | [diff] [blame] | 704 |            def _asdict(t): | 
| Raymond Hettinger | 48eca67 | 2007-12-14 18:08:20 +0000 | [diff] [blame] | 705 |                'Return a new dict which maps field names to their values' | 
| Raymond Hettinger | 8777bca | 2007-12-18 22:21:27 +0000 | [diff] [blame] | 706 |                return {'x': t[0], 'y': t[1]} | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 707 |    <BLANKLINE> | 
| Raymond Hettinger | 42da874 | 2007-12-14 02:49:47 +0000 | [diff] [blame] | 708 |            def _replace(self, **kwds): | 
| Raymond Hettinger | eeeb9c4 | 2007-11-15 02:44:53 +0000 | [diff] [blame] | 709 |                'Return a new Point object replacing specified fields with new values' | 
| Raymond Hettinger | 1166872 | 2008-01-06 09:02:24 +0000 | [diff] [blame] | 710 |                result = self._make(map(kwds.pop, ('x', 'y'), self)) | 
| Raymond Hettinger | 1b50fd7 | 2008-01-05 02:17:24 +0000 | [diff] [blame] | 711 |                if kwds: | 
 | 712 |                    raise ValueError('Got unexpected field names: %r' % kwds.keys()) | 
 | 713 |                return result | 
| Georg Brandl | c62ef8b | 2009-01-03 20:55:06 +0000 | [diff] [blame] | 714 |    <BLANKLINE> | 
 | 715 |            def __getnewargs__(self): | 
| Raymond Hettinger | ee51cff | 2008-06-27 21:34:24 +0000 | [diff] [blame] | 716 |                return tuple(self) | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 717 |    <BLANKLINE> | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 718 |            x = property(itemgetter(0)) | 
 | 719 |            y = property(itemgetter(1)) | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 720 |  | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 721 |    >>> p = Point(11, y=22)     # instantiate with positional or keyword arguments | 
| Raymond Hettinger | 88880b2 | 2007-12-18 00:13:45 +0000 | [diff] [blame] | 722 |    >>> p[0] + p[1]             # indexable like the plain tuple (11, 22) | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 723 |    33 | 
 | 724 |    >>> x, y = p                # unpack like a regular tuple | 
 | 725 |    >>> x, y | 
 | 726 |    (11, 22) | 
| Georg Brandl | 907a720 | 2008-02-22 12:31:45 +0000 | [diff] [blame] | 727 |    >>> p.x + p.y               # fields also accessible by name | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 728 |    33 | 
 | 729 |    >>> p                       # readable __repr__ with a name=value style | 
 | 730 |    Point(x=11, y=22) | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 731 |  | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 732 | Named tuples are especially useful for assigning field names to result tuples returned | 
 | 733 | by the :mod:`csv` or :mod:`sqlite3` modules:: | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 734 |  | 
| Raymond Hettinger | eeeb9c4 | 2007-11-15 02:44:53 +0000 | [diff] [blame] | 735 |    EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade') | 
| Raymond Hettinger | a48a299 | 2007-10-08 21:26:58 +0000 | [diff] [blame] | 736 |  | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 737 |    import csv | 
| Raymond Hettinger | 02740f7 | 2008-01-05 01:35:43 +0000 | [diff] [blame] | 738 |    for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))): | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 739 |        print emp.name, emp.title | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 740 |  | 
| Raymond Hettinger | a48a299 | 2007-10-08 21:26:58 +0000 | [diff] [blame] | 741 |    import sqlite3 | 
 | 742 |    conn = sqlite3.connect('/companydata') | 
 | 743 |    cursor = conn.cursor() | 
 | 744 |    cursor.execute('SELECT name, age, title, department, paygrade FROM employees') | 
| Raymond Hettinger | 02740f7 | 2008-01-05 01:35:43 +0000 | [diff] [blame] | 745 |    for emp in map(EmployeeRecord._make, cursor.fetchall()): | 
| Raymond Hettinger | a48a299 | 2007-10-08 21:26:58 +0000 | [diff] [blame] | 746 |        print emp.name, emp.title | 
 | 747 |  | 
| Raymond Hettinger | 85dfcf3 | 2007-12-18 23:51:15 +0000 | [diff] [blame] | 748 | In addition to the methods inherited from tuples, named tuples support | 
| Raymond Hettinger | ac5742e | 2008-01-08 02:24:15 +0000 | [diff] [blame] | 749 | three additional methods and one attribute.  To prevent conflicts with | 
 | 750 | field names, the method and attribute names start with an underscore. | 
| Raymond Hettinger | 85dfcf3 | 2007-12-18 23:51:15 +0000 | [diff] [blame] | 751 |  | 
| Georg Brandl | b3255ed | 2008-01-07 16:43:47 +0000 | [diff] [blame] | 752 | .. method:: somenamedtuple._make(iterable) | 
| Raymond Hettinger | 85dfcf3 | 2007-12-18 23:51:15 +0000 | [diff] [blame] | 753 |  | 
| Raymond Hettinger | 02740f7 | 2008-01-05 01:35:43 +0000 | [diff] [blame] | 754 |    Class method that makes a new instance from an existing sequence or iterable. | 
| Raymond Hettinger | 85dfcf3 | 2007-12-18 23:51:15 +0000 | [diff] [blame] | 755 |  | 
| Raymond Hettinger | 2950bca | 2009-01-14 01:39:51 +0000 | [diff] [blame] | 756 |    .. doctest:: | 
| Georg Brandl | 8ec7f65 | 2007-08-15 14:28:01 +0000 | [diff] [blame] | 757 |  | 
| Raymond Hettinger | 02740f7 | 2008-01-05 01:35:43 +0000 | [diff] [blame] | 758 |       >>> t = [11, 22] | 
 | 759 |       >>> Point._make(t) | 
 | 760 |       Point(x=11, y=22) | 
| Raymond Hettinger | 2b03d45 | 2007-09-18 03:33:19 +0000 | [diff] [blame] | 761 |  | 
| Georg Brandl | b3255ed | 2008-01-07 16:43:47 +0000 | [diff] [blame] | 762 | .. method:: somenamedtuple._asdict() | 
| Raymond Hettinger | a7fc4b1 | 2007-10-05 02:47:07 +0000 | [diff] [blame] | 763 |  | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 764 |    Return a new dict which maps field names to their corresponding values:: | 
| Raymond Hettinger | a7fc4b1 | 2007-10-05 02:47:07 +0000 | [diff] [blame] | 765 |  | 
| Raymond Hettinger | 42da874 | 2007-12-14 02:49:47 +0000 | [diff] [blame] | 766 |       >>> p._asdict() | 
| Raymond Hettinger | a7fc4b1 | 2007-10-05 02:47:07 +0000 | [diff] [blame] | 767 |       {'x': 11, 'y': 22} | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 768 |  | 
| Georg Brandl | b3255ed | 2008-01-07 16:43:47 +0000 | [diff] [blame] | 769 | .. method:: somenamedtuple._replace(kwargs) | 
| Raymond Hettinger | d36a60e | 2007-09-17 00:55:00 +0000 | [diff] [blame] | 770 |  | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 771 |    Return a new instance of the named tuple replacing specified fields with new | 
| Raymond Hettinger | 2950bca | 2009-01-14 01:39:51 +0000 | [diff] [blame] | 772 |    values:: | 
| Raymond Hettinger | d36a60e | 2007-09-17 00:55:00 +0000 | [diff] [blame] | 773 |  | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 774 |       >>> p = Point(x=11, y=22) | 
| Raymond Hettinger | 42da874 | 2007-12-14 02:49:47 +0000 | [diff] [blame] | 775 |       >>> p._replace(x=33) | 
| Raymond Hettinger | d36a60e | 2007-09-17 00:55:00 +0000 | [diff] [blame] | 776 |       Point(x=33, y=22) | 
 | 777 |  | 
| Raymond Hettinger | 7c3738e | 2007-11-15 03:16:09 +0000 | [diff] [blame] | 778 |       >>> for partnum, record in inventory.items(): | 
| Raymond Hettinger | e11230e | 2008-01-09 03:02:23 +0000 | [diff] [blame] | 779 |       ...     inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now()) | 
| Raymond Hettinger | d36a60e | 2007-09-17 00:55:00 +0000 | [diff] [blame] | 780 |  | 
| Georg Brandl | b3255ed | 2008-01-07 16:43:47 +0000 | [diff] [blame] | 781 | .. attribute:: somenamedtuple._fields | 
| Raymond Hettinger | d36a60e | 2007-09-17 00:55:00 +0000 | [diff] [blame] | 782 |  | 
| Raymond Hettinger | f6b769b | 2008-01-07 21:33:51 +0000 | [diff] [blame] | 783 |    Tuple of strings listing the field names.  Useful for introspection | 
| Raymond Hettinger | a7fc4b1 | 2007-10-05 02:47:07 +0000 | [diff] [blame] | 784 |    and for creating new named tuple types from existing named tuples. | 
| Raymond Hettinger | 7268e9d | 2007-09-20 03:03:43 +0000 | [diff] [blame] | 785 |  | 
| Raymond Hettinger | 2950bca | 2009-01-14 01:39:51 +0000 | [diff] [blame] | 786 |    .. doctest:: | 
| Raymond Hettinger | d36a60e | 2007-09-17 00:55:00 +0000 | [diff] [blame] | 787 |  | 
| Raymond Hettinger | 42da874 | 2007-12-14 02:49:47 +0000 | [diff] [blame] | 788 |       >>> p._fields            # view the field names | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 789 |       ('x', 'y') | 
| Raymond Hettinger | d36a60e | 2007-09-17 00:55:00 +0000 | [diff] [blame] | 790 |  | 
| Raymond Hettinger | eeeb9c4 | 2007-11-15 02:44:53 +0000 | [diff] [blame] | 791 |       >>> Color = namedtuple('Color', 'red green blue') | 
| Raymond Hettinger | 42da874 | 2007-12-14 02:49:47 +0000 | [diff] [blame] | 792 |       >>> Pixel = namedtuple('Pixel', Point._fields + Color._fields) | 
| Raymond Hettinger | cbab594 | 2007-09-18 22:18:02 +0000 | [diff] [blame] | 793 |       >>> Pixel(11, 22, 128, 255, 0) | 
| Raymond Hettinger | dc1854d | 2008-01-09 03:13:20 +0000 | [diff] [blame] | 794 |       Pixel(x=11, y=22, red=128, green=255, blue=0) | 
| Raymond Hettinger | d36a60e | 2007-09-17 00:55:00 +0000 | [diff] [blame] | 795 |  | 
| Raymond Hettinger | e846f38 | 2007-12-14 21:51:50 +0000 | [diff] [blame] | 796 | To retrieve a field whose name is stored in a string, use the :func:`getattr` | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 797 | function: | 
| Raymond Hettinger | e846f38 | 2007-12-14 21:51:50 +0000 | [diff] [blame] | 798 |  | 
 | 799 |     >>> getattr(p, 'x') | 
 | 800 |     11 | 
 | 801 |  | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 802 | To convert a dictionary to a named tuple, use the double-star-operator [#]_: | 
| Raymond Hettinger | 85dfcf3 | 2007-12-18 23:51:15 +0000 | [diff] [blame] | 803 |  | 
 | 804 |    >>> d = {'x': 11, 'y': 22} | 
 | 805 |    >>> Point(**d) | 
 | 806 |    Point(x=11, y=22) | 
 | 807 |  | 
| Raymond Hettinger | eeeb9c4 | 2007-11-15 02:44:53 +0000 | [diff] [blame] | 808 | Since a named tuple is a regular Python class, it is easy to add or change | 
| Raymond Hettinger | b8e0072 | 2008-01-07 04:24:49 +0000 | [diff] [blame] | 809 | functionality with a subclass.  Here is how to add a calculated field and | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 810 | a fixed-width print format: | 
| Raymond Hettinger | eeeb9c4 | 2007-11-15 02:44:53 +0000 | [diff] [blame] | 811 |  | 
| Raymond Hettinger | b8e0072 | 2008-01-07 04:24:49 +0000 | [diff] [blame] | 812 |     >>> class Point(namedtuple('Point', 'x y')): | 
| Raymond Hettinger | e165508 | 2008-01-10 19:15:10 +0000 | [diff] [blame] | 813 |     ...     __slots__ = () | 
| Raymond Hettinger | e11230e | 2008-01-09 03:02:23 +0000 | [diff] [blame] | 814 |     ...     @property | 
 | 815 |     ...     def hypot(self): | 
 | 816 |     ...         return (self.x ** 2 + self.y ** 2) ** 0.5 | 
 | 817 |     ...     def __str__(self): | 
| Raymond Hettinger | 15b5e55 | 2008-01-10 23:00:01 +0000 | [diff] [blame] | 818 |     ...         return 'Point: x=%6.3f  y=%6.3f  hypot=%6.3f' % (self.x, self.y, self.hypot) | 
| Raymond Hettinger | b8e0072 | 2008-01-07 04:24:49 +0000 | [diff] [blame] | 819 |  | 
| Raymond Hettinger | e165508 | 2008-01-10 19:15:10 +0000 | [diff] [blame] | 820 |     >>> for p in Point(3, 4), Point(14, 5/7.): | 
| Raymond Hettinger | e11230e | 2008-01-09 03:02:23 +0000 | [diff] [blame] | 821 |     ...     print p | 
| Raymond Hettinger | 15b5e55 | 2008-01-10 23:00:01 +0000 | [diff] [blame] | 822 |     Point: x= 3.000  y= 4.000  hypot= 5.000 | 
 | 823 |     Point: x=14.000  y= 0.714  hypot=14.018 | 
| Raymond Hettinger | eeeb9c4 | 2007-11-15 02:44:53 +0000 | [diff] [blame] | 824 |  | 
| Raymond Hettinger | 9bba7b7 | 2008-01-27 10:47:55 +0000 | [diff] [blame] | 825 | The subclass shown above sets ``__slots__`` to an empty tuple.  This keeps | 
| Raymond Hettinger | 171f391 | 2008-01-16 23:38:16 +0000 | [diff] [blame] | 826 | keep memory requirements low by preventing the creation of instance dictionaries. | 
| Raymond Hettinger | f59e962 | 2008-01-15 20:52:42 +0000 | [diff] [blame] | 827 |  | 
| Raymond Hettinger | ac5742e | 2008-01-08 02:24:15 +0000 | [diff] [blame] | 828 | Subclassing is not useful for adding new, stored fields.  Instead, simply | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 829 | create a new named tuple type from the :attr:`_fields` attribute: | 
| Raymond Hettinger | ac5742e | 2008-01-08 02:24:15 +0000 | [diff] [blame] | 830 |  | 
| Raymond Hettinger | e850c46 | 2008-01-10 20:37:12 +0000 | [diff] [blame] | 831 |     >>> Point3D = namedtuple('Point3D', Point._fields + ('z',)) | 
| Raymond Hettinger | ac5742e | 2008-01-08 02:24:15 +0000 | [diff] [blame] | 832 |  | 
| Raymond Hettinger | fb3ced6 | 2008-01-07 20:17:35 +0000 | [diff] [blame] | 833 | Default values can be implemented by using :meth:`_replace` to | 
| Georg Brandl | 4c8bbe6 | 2008-03-22 21:06:20 +0000 | [diff] [blame] | 834 | customize a prototype instance: | 
| Raymond Hettinger | bc69349 | 2007-11-15 22:39:34 +0000 | [diff] [blame] | 835 |  | 
 | 836 |     >>> Account = namedtuple('Account', 'owner balance transaction_count') | 
| Raymond Hettinger | 0fe6ca4 | 2008-01-18 21:14:58 +0000 | [diff] [blame] | 837 |     >>> default_account = Account('<owner name>', 0.0, 0) | 
 | 838 |     >>> johns_account = default_account._replace(owner='John') | 
| Raymond Hettinger | bc69349 | 2007-11-15 22:39:34 +0000 | [diff] [blame] | 839 |  | 
| Raymond Hettinger | 5a9fed7 | 2008-05-08 07:23:30 +0000 | [diff] [blame] | 840 | Enumerated constants can be implemented with named tuples, but it is simpler | 
 | 841 | and more efficient to use a simple class declaration: | 
 | 842 |  | 
 | 843 |     >>> Status = namedtuple('Status', 'open pending closed')._make(range(3)) | 
 | 844 |     >>> Status.open, Status.pending, Status.closed | 
 | 845 |     (0, 1, 2) | 
 | 846 |     >>> class Status: | 
 | 847 |     ...     open, pending, closed = range(3) | 
 | 848 |  | 
| Mark Summerfield | 7f626f4 | 2007-08-30 15:03:03 +0000 | [diff] [blame] | 849 | .. rubric:: Footnotes | 
 | 850 |  | 
| Raymond Hettinger | 85dfcf3 | 2007-12-18 23:51:15 +0000 | [diff] [blame] | 851 | .. [#] For information on the double-star-operator see | 
| Mark Summerfield | 7f626f4 | 2007-08-30 15:03:03 +0000 | [diff] [blame] | 852 |    :ref:`tut-unpacking-arguments` and :ref:`calls`. |