blob: c69f4ca84ec049d2dd0b1da525cc8f99bbe68e6c [file] [log] [blame]
Brett Cannon23a4a7b2008-05-12 00:56:28 +00001__all__ = ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList',
Raymond Hettinger2d32f632009-03-02 21:24:57 +00002 'UserString', 'Counter', 'OrderedDict']
Guido van Rossumcd16bf62007-06-13 18:07:49 +00003# For bootstrapping reasons, the collection ABCs are defined in _abcoll.py.
4# They should however be considered an integral part of collections.py.
5from _abcoll import *
6import _abcoll
7__all__ += _abcoll.__all__
8
Christian Heimes99170a52007-12-19 02:07:34 +00009from _collections import deque, defaultdict
10from operator import itemgetter as _itemgetter
11from keyword import iskeyword as _iskeyword
12import sys as _sys
Raymond Hettingerb8baf632009-01-14 02:20:07 +000013import heapq as _heapq
Raymond Hettingerfa11db02010-09-12 04:12:42 +000014from weakref import proxy as _proxy
Raymond Hettingerea9f8db2009-03-02 21:28:41 +000015from itertools import repeat as _repeat, chain as _chain, starmap as _starmap
Raymond Hettinger98a5f3f2010-09-13 21:36:00 +000016from reprlib import recursive_repr as _recursive_repr
Raymond Hettinger2d32f632009-03-02 21:24:57 +000017
18################################################################################
19### OrderedDict
20################################################################################
21
Raymond Hettingerfa11db02010-09-12 04:12:42 +000022class _Link(object):
23 __slots__ = 'prev', 'next', 'key', '__weakref__'
24
Raymond Hettinger2d32f632009-03-02 21:24:57 +000025class OrderedDict(dict, MutableMapping):
Raymond Hettinger18ed2cb2009-03-19 23:14:39 +000026 'Dictionary that remembers insertion order'
Raymond Hettingerf1736542009-03-23 05:19:21 +000027 # An inherited dict maps keys to values.
Raymond Hettinger18ed2cb2009-03-19 23:14:39 +000028 # The inherited dict provides __getitem__, __len__, __contains__, and get.
29 # The remaining methods are order-aware.
Raymond Hettingerf1736542009-03-23 05:19:21 +000030 # Big-O running times for all methods are the same as for regular dictionaries.
31
32 # The internal self.__map dictionary maps keys to links in a doubly linked list.
33 # The circular doubly linked list starts and ends with a sentinel element.
34 # The sentinel element never gets deleted (this simplifies the algorithm).
Raymond Hettingerf7328d02010-09-14 19:40:15 +000035 # The sentinel is stored in self.__hardroot with a weakref proxy in self.__root.
Raymond Hettingerc5c29c02010-09-12 18:13:46 +000036 # The prev/next links are weakref proxies (to prevent circular references).
37 # Individual links are kept alive by the hard reference in self.__map.
38 # Those hard references disappear when a key is deleted from an OrderedDict.
Raymond Hettinger2d32f632009-03-02 21:24:57 +000039
40 def __init__(self, *args, **kwds):
Raymond Hettingerf04fa1b2009-04-08 01:15:02 +000041 '''Initialize an ordered dictionary. Signature is the same as for
42 regular dictionaries, but keyword arguments are not recommended
43 because their insertion order is arbitrary.
44
45 '''
Raymond Hettinger2d32f632009-03-02 21:24:57 +000046 if len(args) > 1:
47 raise TypeError('expected at most 1 arguments, got %d' % len(args))
Raymond Hettinger08c70cf2009-03-03 20:47:29 +000048 try:
Raymond Hettingerf1736542009-03-23 05:19:21 +000049 self.__root
Raymond Hettinger08c70cf2009-03-03 20:47:29 +000050 except AttributeError:
Raymond Hettingerf7328d02010-09-14 19:40:15 +000051 self.__hardroot = _Link()
52 self.__root = root = _proxy(self.__hardroot)
Raymond Hettingerfa11db02010-09-12 04:12:42 +000053 root.prev = root.next = root
Raymond Hettinger52dc06b2009-03-25 22:45:22 +000054 self.__map = {}
Raymond Hettinger2d32f632009-03-02 21:24:57 +000055 self.update(*args, **kwds)
56
Raymond Hettingerfa11db02010-09-12 04:12:42 +000057 def __setitem__(self, key, value,
58 dict_setitem=dict.__setitem__, proxy=_proxy, Link=_Link):
Raymond Hettingerf04fa1b2009-04-08 01:15:02 +000059 'od.__setitem__(i, y) <==> od[i]=y'
Raymond Hettingerf1736542009-03-23 05:19:21 +000060 # Setting a new item creates a new link which goes at the end of the linked
61 # list, and the inherited dictionary is updated with the new key/value pair.
Raymond Hettinger2d32f632009-03-02 21:24:57 +000062 if key not in self:
Raymond Hettingerfa11db02010-09-12 04:12:42 +000063 self.__map[key] = link = Link()
Raymond Hettingerf1736542009-03-23 05:19:21 +000064 root = self.__root
Raymond Hettingerfa11db02010-09-12 04:12:42 +000065 last = root.prev
66 link.prev, link.next, link.key = last, root, key
Raymond Hettingerf7328d02010-09-14 19:40:15 +000067 last.next = link
68 root.prev = proxy(link)
69 dict_setitem(self, key, value)
Raymond Hettinger2d32f632009-03-02 21:24:57 +000070
Raymond Hettingerfa11db02010-09-12 04:12:42 +000071 def __delitem__(self, key, dict_delitem=dict.__delitem__):
Raymond Hettingerf04fa1b2009-04-08 01:15:02 +000072 'od.__delitem__(y) <==> del od[y]'
Raymond Hettingerf1736542009-03-23 05:19:21 +000073 # Deleting an existing item uses self.__map to find the link which is
74 # then removed by updating the links in the predecessor and successor nodes.
Raymond Hettinger5be21b72010-08-01 22:10:57 +000075 dict_delitem(self, key)
Raymond Hettingerf1736542009-03-23 05:19:21 +000076 link = self.__map.pop(key)
Raymond Hettingerfa11db02010-09-12 04:12:42 +000077 link_prev = link.prev
78 link_next = link.next
79 link_prev.next = link_next
80 link_next.prev = link_prev
Raymond Hettinger2d32f632009-03-02 21:24:57 +000081
Raymond Hettingerfa11db02010-09-12 04:12:42 +000082 def __iter__(self):
Raymond Hettingerf04fa1b2009-04-08 01:15:02 +000083 'od.__iter__() <==> iter(od)'
Raymond Hettingerf1736542009-03-23 05:19:21 +000084 # Traverse the linked list in order.
85 root = self.__root
Raymond Hettingerfa11db02010-09-12 04:12:42 +000086 curr = root.next
Raymond Hettingerf1736542009-03-23 05:19:21 +000087 while curr is not root:
Raymond Hettingerfa11db02010-09-12 04:12:42 +000088 yield curr.key
89 curr = curr.next
Raymond Hettinger2d32f632009-03-02 21:24:57 +000090
Raymond Hettingerfa11db02010-09-12 04:12:42 +000091 def __reversed__(self):
Raymond Hettinger2352cf32009-04-08 01:16:27 +000092 'od.__reversed__() <==> reversed(od)'
Raymond Hettingerf1736542009-03-23 05:19:21 +000093 # Traverse the linked list in reverse order.
94 root = self.__root
Raymond Hettingerfa11db02010-09-12 04:12:42 +000095 curr = root.prev
Raymond Hettingerf1736542009-03-23 05:19:21 +000096 while curr is not root:
Raymond Hettingerfa11db02010-09-12 04:12:42 +000097 yield curr.key
98 curr = curr.prev
Raymond Hettinger2d32f632009-03-02 21:24:57 +000099
Raymond Hettinger5be21b72010-08-01 22:10:57 +0000100 def clear(self):
101 'od.clear() -> None. Remove all items from od.'
Raymond Hettingerfa11db02010-09-12 04:12:42 +0000102 root = self.__root
103 root.prev = root.next = root
104 self.__map.clear()
Raymond Hettinger5be21b72010-08-01 22:10:57 +0000105 dict.clear(self)
106
Raymond Hettingerfa11db02010-09-12 04:12:42 +0000107 def popitem(self, last=True):
Raymond Hettinger331722d2010-09-02 18:44:16 +0000108 '''od.popitem() -> (k, v), return and remove a (key, value) pair.
109 Pairs are returned in LIFO order if last is true or FIFO order if false.
110
111 '''
112 if not self:
113 raise KeyError('dictionary is empty')
114 root = self.__root
Raymond Hettingerfa11db02010-09-12 04:12:42 +0000115 if last:
116 link = root.prev
117 link_prev = link.prev
118 link_prev.next = root
119 root.prev = link_prev
120 else:
121 link = root.next
122 link_next = link.next
123 root.next = link_next
124 link_next.prev = root
125 key = link.key
Raymond Hettinger331722d2010-09-02 18:44:16 +0000126 del self.__map[key]
Raymond Hettingerfa11db02010-09-12 04:12:42 +0000127 value = dict.pop(self, key)
Raymond Hettinger331722d2010-09-02 18:44:16 +0000128 return key, value
129
Raymond Hettingerfa11db02010-09-12 04:12:42 +0000130 def move_to_end(self, key, last=True):
131 '''Move an existing element to the end (or beginning if last==False).
132
133 Raises KeyError if the element does not exist.
134 When last=True, acts like a fast version of self[key]=self.pop(key).
135
136 '''
137 link = self.__map[key]
138 link_prev = link.prev
139 link_next = link.next
140 link_prev.next = link_next
141 link_next.prev = link_prev
142 root = self.__root
143 if last:
144 last = root.prev
145 link.prev = last
146 link.next = root
147 last.next = root.prev = link
148 else:
149 first = root.next
150 link.prev = root
151 link.next = first
152 root.next = first.prev = link
153
Raymond Hettinger35c87f22010-09-16 19:10:17 +0000154 def __reduce__(self):
155 'Return state information for pickling'
156 items = [[k, self[k]] for k in self]
157 tmp = self.__map, self.__root, self.__hardroot
158 del self.__map, self.__root, self.__hardroot
159 inst_dict = vars(self).copy()
160 self.__map, self.__root, self.__hardroot = tmp
161 if inst_dict:
162 return (self.__class__, (items,), inst_dict)
163 return self.__class__, (items,)
164
165 def __sizeof__(self):
166 sizeof = _sys.getsizeof
167 n = len(self) + 1 # number of links including root
168 size = sizeof(self.__dict__) # instance dictionary
169 size += sizeof(self.__map) * 2 # internal dict and inherited dict
170 size += sizeof(self.__hardroot) * n # link objects
171 size += sizeof(self.__root) * n # proxy objects
172 return size
173
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000174 update = MutableMapping.update
175 pop = MutableMapping.pop
176 keys = MutableMapping.keys
177 values = MutableMapping.values
178 items = MutableMapping.items
Raymond Hettinger5be21b72010-08-01 22:10:57 +0000179 __ne__ = MutableMapping.__ne__
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000180
Raymond Hettingera673b1f2010-12-31 23:16:17 +0000181 def setdefault(self, key, default=None):
182 'OD.setdefault(k[,d]) -> OD.get(k,d), also set OD[k]=d if k not in OD'
183 if key in self:
184 return self[key]
185 self[key] = default
186 return default
187
Raymond Hettinger98a5f3f2010-09-13 21:36:00 +0000188 @_recursive_repr()
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000189 def __repr__(self):
Raymond Hettingerf04fa1b2009-04-08 01:15:02 +0000190 'od.__repr__() <==> repr(od)'
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000191 if not self:
192 return '%s()' % (self.__class__.__name__,)
Raymond Hettinger98a5f3f2010-09-13 21:36:00 +0000193 return '%s(%r)' % (self.__class__.__name__, list(self.items()))
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000194
195 def copy(self):
Raymond Hettingerf04fa1b2009-04-08 01:15:02 +0000196 'od.copy() -> a shallow copy of od'
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000197 return self.__class__(self)
198
199 @classmethod
200 def fromkeys(cls, iterable, value=None):
Raymond Hettingerf04fa1b2009-04-08 01:15:02 +0000201 '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
202 and values equal to v (which defaults to None).
203
204 '''
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000205 d = cls()
206 for key in iterable:
207 d[key] = value
208 return d
209
210 def __eq__(self, other):
Raymond Hettingerf04fa1b2009-04-08 01:15:02 +0000211 '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive
212 while comparison to a regular mapping is order-insensitive.
213
214 '''
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000215 if isinstance(other, OrderedDict):
Raymond Hettinger798ee1a2009-03-23 18:29:11 +0000216 return len(self)==len(other) and \
217 all(p==q for p, q in zip(self.items(), other.items()))
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000218 return dict.__eq__(self, other)
219
Christian Heimes99170a52007-12-19 02:07:34 +0000220
Raymond Hettinger48b8b662008-02-05 01:53:00 +0000221################################################################################
222### namedtuple
223################################################################################
224
Benjamin Petersona86f2c02009-02-10 02:41:10 +0000225def namedtuple(typename, field_names, verbose=False, rename=False):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000226 """Returns a new subclass of tuple with named fields.
227
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000228 >>> Point = namedtuple('Point', 'x y')
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000229 >>> Point.__doc__ # docstring for the new class
Guido van Rossumd8faa362007-04-27 19:54:29 +0000230 'Point(x, y)'
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000231 >>> p = Point(11, y=22) # instantiate with positional args or keywords
Christian Heimes99170a52007-12-19 02:07:34 +0000232 >>> p[0] + p[1] # indexable like a plain tuple
Guido van Rossumd8faa362007-04-27 19:54:29 +0000233 33
Christian Heimes99170a52007-12-19 02:07:34 +0000234 >>> x, y = p # unpack like a regular tuple
Guido van Rossumd8faa362007-04-27 19:54:29 +0000235 >>> x, y
236 (11, 22)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000237 >>> p.x + p.y # fields also accessable by name
Guido van Rossumd8faa362007-04-27 19:54:29 +0000238 33
Christian Heimes0449f632007-12-15 01:27:15 +0000239 >>> d = p._asdict() # convert to a dictionary
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000240 >>> d['x']
241 11
242 >>> Point(**d) # convert from a dictionary
Guido van Rossumd8faa362007-04-27 19:54:29 +0000243 Point(x=11, y=22)
Christian Heimes0449f632007-12-15 01:27:15 +0000244 >>> p._replace(x=100) # _replace() is like str.replace() but targets named fields
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000245 Point(x=100, y=22)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000246
247 """
248
Christian Heimes2380ac72008-01-09 00:17:24 +0000249 # Parse and validate the field names. Validation serves two purposes,
250 # generating informative error messages and preventing template injection attacks.
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000251 if isinstance(field_names, str):
252 field_names = field_names.replace(',', ' ').split() # names separated by whitespace and/or commas
Benjamin Petersone9bbc8b2008-09-28 02:06:32 +0000253 field_names = tuple(map(str, field_names))
Benjamin Petersona86f2c02009-02-10 02:41:10 +0000254 if rename:
255 names = list(field_names)
256 seen = set()
257 for i, name in enumerate(names):
258 if (not all(c.isalnum() or c=='_' for c in name) or _iskeyword(name)
259 or not name or name[0].isdigit() or name.startswith('_')
260 or name in seen):
Raymond Hettinger56145242009-04-02 22:31:59 +0000261 names[i] = '_%d' % i
Benjamin Petersona86f2c02009-02-10 02:41:10 +0000262 seen.add(name)
263 field_names = tuple(names)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000264 for name in (typename,) + field_names:
Christian Heimesb9eccbf2007-12-05 20:18:38 +0000265 if not all(c.isalnum() or c=='_' for c in name):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000266 raise ValueError('Type names and field names can only contain alphanumeric characters and underscores: %r' % name)
267 if _iskeyword(name):
268 raise ValueError('Type names and field names cannot be a keyword: %r' % name)
269 if name[0].isdigit():
270 raise ValueError('Type names and field names cannot start with a number: %r' % name)
271 seen_names = set()
272 for name in field_names:
Benjamin Petersona86f2c02009-02-10 02:41:10 +0000273 if name.startswith('_') and not rename:
Christian Heimes0449f632007-12-15 01:27:15 +0000274 raise ValueError('Field names cannot start with an underscore: %r' % name)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000275 if name in seen_names:
276 raise ValueError('Encountered duplicate field name: %r' % name)
277 seen_names.add(name)
278
279 # Create and fill-in the class template
Christian Heimesfaf2f632008-01-06 16:59:19 +0000280 numfields = len(field_names)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000281 argtxt = repr(field_names).replace("'", "")[1:-1] # tuple repr without parens or quotes
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000282 reprtxt = ', '.join('%s=%%r' % name for name in field_names)
283 template = '''class %(typename)s(tuple):
Christian Heimes0449f632007-12-15 01:27:15 +0000284 '%(typename)s(%(argtxt)s)' \n
285 __slots__ = () \n
Christian Heimesfaf2f632008-01-06 16:59:19 +0000286 _fields = %(field_names)r \n
Raymond Hettinger089ba7f2009-05-27 00:38:24 +0000287 def __new__(_cls, %(argtxt)s):
Raymond Hettinger7b0d3c62010-04-02 18:54:02 +0000288 'Create new instance of %(typename)s(%(argtxt)s)'
Raymond Hettinger089ba7f2009-05-27 00:38:24 +0000289 return _tuple.__new__(_cls, (%(argtxt)s)) \n
Christian Heimesfaf2f632008-01-06 16:59:19 +0000290 @classmethod
Christian Heimes043d6f62008-01-07 17:19:16 +0000291 def _make(cls, iterable, new=tuple.__new__, len=len):
Christian Heimesfaf2f632008-01-06 16:59:19 +0000292 'Make a new %(typename)s object from a sequence or iterable'
Christian Heimes043d6f62008-01-07 17:19:16 +0000293 result = new(cls, iterable)
Christian Heimesfaf2f632008-01-06 16:59:19 +0000294 if len(result) != %(numfields)d:
295 raise TypeError('Expected %(numfields)d arguments, got %%d' %% len(result))
296 return result \n
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000297 def __repr__(self):
Raymond Hettinger7b0d3c62010-04-02 18:54:02 +0000298 'Return a nicely formatted representation string'
Raymond Hettingerd331ce92010-08-08 01:13:42 +0000299 return self.__class__.__name__ + '(%(reprtxt)s)' %% self \n
Raymond Hettingera4f52b12009-03-02 22:28:31 +0000300 def _asdict(self):
301 'Return a new OrderedDict which maps field names to their values'
302 return OrderedDict(zip(self._fields, self)) \n
Raymond Hettinger089ba7f2009-05-27 00:38:24 +0000303 def _replace(_self, **kwds):
Guido van Rossum3d392eb2007-11-16 00:35:22 +0000304 'Return a new %(typename)s object replacing specified fields with new values'
Raymond Hettinger089ba7f2009-05-27 00:38:24 +0000305 result = _self._make(map(kwds.pop, %(field_names)r, _self))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000306 if kwds:
307 raise ValueError('Got unexpected field names: %%r' %% kwds.keys())
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000308 return result \n
309 def __getnewargs__(self):
Raymond Hettinger7b0d3c62010-04-02 18:54:02 +0000310 'Return self as a plain tuple. Used by copy and pickle.'
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000311 return tuple(self) \n\n''' % locals()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000312 for i, name in enumerate(field_names):
Raymond Hettinger7b0d3c62010-04-02 18:54:02 +0000313 template += " %s = _property(_itemgetter(%d), doc='Alias for field number %d')\n" % (name, i, i)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000314 if verbose:
315 print(template)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000316
Georg Brandlf08a9dd2008-06-10 16:57:31 +0000317 # Execute the template string in a temporary namespace and
318 # support tracing utilities by setting a value for frame.f_globals['__name__']
Raymond Hettinger089ba7f2009-05-27 00:38:24 +0000319 namespace = dict(_itemgetter=_itemgetter, __name__='namedtuple_%s' % typename,
320 OrderedDict=OrderedDict, _property=property, _tuple=tuple)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000321 try:
322 exec(template, namespace)
323 except SyntaxError as e:
Raymond Hettingerc1cc0d02010-09-16 08:06:05 +0000324 raise SyntaxError(e.msg + ':\n\n' + template)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000325 result = namespace[typename]
326
327 # For pickling to work, the __module__ variable needs to be set to the frame
328 # where the named tuple is created. Bypass this step in enviroments where
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000329 # sys._getframe is not defined (Jython for example) or sys._getframe is not
330 # defined for arguments greater than 0 (IronPython).
331 try:
Raymond Hettinger0f055172009-01-27 10:06:09 +0000332 result.__module__ = _sys._getframe(1).f_globals.get('__name__', '__main__')
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000333 except (AttributeError, ValueError):
334 pass
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000335
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000336 return result
Guido van Rossumd8faa362007-04-27 19:54:29 +0000337
Guido van Rossumd8faa362007-04-27 19:54:29 +0000338
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000339########################################################################
340### Counter
341########################################################################
342
Raymond Hettinger96f34102010-12-15 16:30:37 +0000343def _count_elements(mapping, iterable):
344 'Tally elements from the iterable.'
345 mapping_get = mapping.get
346 for elem in iterable:
347 mapping[elem] = mapping_get(elem, 0) + 1
348
349try: # Load C helper function if available
350 from _collections import _count_elements
351except ImportError:
352 pass
353
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000354class Counter(dict):
355 '''Dict subclass for counting hashable items. Sometimes called a bag
356 or multiset. Elements are stored as dictionary keys and their counts
357 are stored as dictionary values.
358
359 >>> c = Counter('abracadabra') # count elements from a string
360
361 >>> c.most_common(3) # three most common elements
362 [('a', 5), ('r', 2), ('b', 2)]
363 >>> sorted(c) # list all unique elements
364 ['a', 'b', 'c', 'd', 'r']
365 >>> ''.join(sorted(c.elements())) # list elements with repetitions
366 'aaaaabbcdrr'
367 >>> sum(c.values()) # total of all counts
368 11
369
370 >>> c['a'] # count of letter 'a'
371 5
372 >>> for elem in 'shazam': # update counts from an iterable
373 ... c[elem] += 1 # by adding 1 to each element's count
374 >>> c['a'] # now there are seven 'a'
375 7
376 >>> del c['r'] # remove all 'r'
377 >>> c['r'] # now there are zero 'r'
378 0
379
380 >>> d = Counter('simsalabim') # make another counter
381 >>> c.update(d) # add in the second counter
382 >>> c['a'] # now there are nine 'a'
383 9
384
385 >>> c.clear() # empty the counter
386 >>> c
387 Counter()
388
389 Note: If a count is set to zero or reduced to zero, it will remain
390 in the counter until the entry is deleted or the counter is cleared:
391
392 >>> c = Counter('aaabbc')
393 >>> c['b'] -= 2 # reduce the count of 'b' by two
394 >>> c.most_common() # 'b' is still in, but its count is zero
395 [('a', 3), ('c', 1), ('b', 0)]
396
397 '''
398 # References:
399 # http://en.wikipedia.org/wiki/Multiset
400 # http://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html
401 # http://www.demo2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm
402 # http://code.activestate.com/recipes/259174/
403 # Knuth, TAOCP Vol. II section 4.6.3
404
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000405 def __init__(self, iterable=None, **kwds):
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000406 '''Create a new, empty Counter object. And if given, count elements
407 from an input iterable. Or, initialize the count from another mapping
408 of elements to their counts.
409
410 >>> c = Counter() # a new, empty counter
411 >>> c = Counter('gallahad') # a new counter from an iterable
412 >>> c = Counter({'a': 4, 'b': 2}) # a new counter from a mapping
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000413 >>> c = Counter(a=4, b=2) # a new counter from keyword args
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000414
415 '''
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000416 self.update(iterable, **kwds)
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000417
418 def __missing__(self, key):
419 'The count of elements not in the Counter is zero.'
420 # Needed so that self[missing_item] does not raise KeyError
421 return 0
422
423 def most_common(self, n=None):
424 '''List the n most common elements and their counts from the most
425 common to the least. If n is None, then list all element counts.
426
427 >>> Counter('abracadabra').most_common(3)
428 [('a', 5), ('r', 2), ('b', 2)]
429
430 '''
431 # Emulate Bag.sortedByCount from Smalltalk
432 if n is None:
433 return sorted(self.items(), key=_itemgetter(1), reverse=True)
434 return _heapq.nlargest(n, self.items(), key=_itemgetter(1))
435
436 def elements(self):
437 '''Iterator over elements repeating each as many times as its count.
438
439 >>> c = Counter('ABCABC')
440 >>> sorted(c.elements())
441 ['A', 'A', 'B', 'B', 'C', 'C']
442
443 # Knuth's example for prime factors of 1836: 2**2 * 3**3 * 17**1
444 >>> prime_factors = Counter({2: 2, 3: 3, 17: 1})
445 >>> product = 1
446 >>> for factor in prime_factors.elements(): # loop over factors
447 ... product *= factor # and multiply them
448 >>> product
449 1836
450
451 Note, if an element's count has been set to zero or is a negative
452 number, elements() will ignore it.
453
454 '''
455 # Emulate Bag.do from Smalltalk and Multiset.begin from C++.
456 return _chain.from_iterable(_starmap(_repeat, self.items()))
457
458 # Override dict methods where necessary
459
460 @classmethod
461 def fromkeys(cls, iterable, v=None):
462 # There is no equivalent method for counters because setting v=1
463 # means that no element can have a count greater than one.
464 raise NotImplementedError(
465 'Counter.fromkeys() is undefined. Use Counter(iterable) instead.')
466
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000467 def update(self, iterable=None, **kwds):
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000468 '''Like dict.update() but add counts instead of replacing them.
469
470 Source can be an iterable, a dictionary, or another Counter instance.
471
472 >>> c = Counter('which')
473 >>> c.update('witch') # add elements from another iterable
474 >>> d = Counter('watch')
475 >>> c.update(d) # add elements from another counter
476 >>> c['h'] # four 'h' in which, witch, and watch
477 4
478
479 '''
480 # The regular dict.update() operation makes no sense here because the
481 # replace behavior results in the some of original untouched counts
482 # being mixed-in with all of the other counts for a mismash that
483 # doesn't have a straight-forward interpretation in most counting
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000484 # contexts. Instead, we implement straight-addition. Both the inputs
485 # and outputs are allowed to contain zero and negative counts.
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000486
487 if iterable is not None:
488 if isinstance(iterable, Mapping):
Raymond Hettingerdd01f8f2009-01-22 09:09:55 +0000489 if self:
Raymond Hettingerf9092022009-06-29 18:30:43 +0000490 self_get = self.get
Raymond Hettingerdd01f8f2009-01-22 09:09:55 +0000491 for elem, count in iterable.items():
Raymond Hettingerf9092022009-06-29 18:30:43 +0000492 self[elem] = count + self_get(elem, 0)
Raymond Hettingerdd01f8f2009-01-22 09:09:55 +0000493 else:
494 dict.update(self, iterable) # fast path when counter is empty
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000495 else:
Raymond Hettinger96f34102010-12-15 16:30:37 +0000496 _count_elements(self, iterable)
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000497 if kwds:
498 self.update(kwds)
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000499
Raymond Hettinger9c01e442010-04-03 10:32:58 +0000500 def subtract(self, iterable=None, **kwds):
501 '''Like dict.update() but subtracts counts instead of replacing them.
502 Counts can be reduced below zero. Both the inputs and outputs are
503 allowed to contain zero and negative counts.
504
505 Source can be an iterable, a dictionary, or another Counter instance.
506
507 >>> c = Counter('which')
508 >>> c.subtract('witch') # subtract elements from another iterable
509 >>> c.subtract(Counter('watch')) # subtract elements from another counter
510 >>> c['h'] # 2 in which, minus 1 in witch, minus 1 in watch
511 0
512 >>> c['w'] # 1 in which, minus 1 in witch, minus 1 in watch
513 -1
514
515 '''
516 if iterable is not None:
Raymond Hettingerfc3c9cd2010-04-11 20:41:56 +0000517 self_get = self.get
Raymond Hettinger9c01e442010-04-03 10:32:58 +0000518 if isinstance(iterable, Mapping):
Raymond Hettinger9c01e442010-04-03 10:32:58 +0000519 for elem, count in iterable.items():
520 self[elem] = self_get(elem, 0) - count
521 else:
Raymond Hettinger9c01e442010-04-03 10:32:58 +0000522 for elem in iterable:
523 self[elem] = self_get(elem, 0) - 1
524 if kwds:
525 self.subtract(kwds)
526
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000527 def copy(self):
528 'Like dict.copy() but returns a Counter instance instead of a dict.'
529 return Counter(self)
530
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000531 def __delitem__(self, elem):
532 'Like dict.__delitem__() but does not raise KeyError for missing values.'
533 if elem in self:
534 dict.__delitem__(self, elem)
535
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000536 def __repr__(self):
537 if not self:
538 return '%s()' % self.__class__.__name__
539 items = ', '.join(map('%r: %r'.__mod__, self.most_common()))
540 return '%s({%s})' % (self.__class__.__name__, items)
541
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000542 # Multiset-style mathematical operations discussed in:
543 # Knuth TAOCP Volume II section 4.6.3 exercise 19
544 # and at http://en.wikipedia.org/wiki/Multiset
545 #
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000546 # Outputs guaranteed to only include positive counts.
547 #
548 # To strip negative and zero counts, add-in an empty counter:
549 # c += Counter()
550
551 def __add__(self, other):
552 '''Add counts from two counters.
553
554 >>> Counter('abbb') + Counter('bcc')
555 Counter({'b': 4, 'c': 2, 'a': 1})
556
557 '''
558 if not isinstance(other, Counter):
559 return NotImplemented
560 result = Counter()
561 for elem in set(self) | set(other):
562 newcount = self[elem] + other[elem]
563 if newcount > 0:
564 result[elem] = newcount
565 return result
566
567 def __sub__(self, other):
568 ''' Subtract count, but keep only results with positive counts.
569
570 >>> Counter('abbbc') - Counter('bccd')
571 Counter({'b': 2, 'a': 1})
572
573 '''
574 if not isinstance(other, Counter):
575 return NotImplemented
576 result = Counter()
Raymond Hettingere0d1b9f2009-01-21 20:36:27 +0000577 for elem in set(self) | set(other):
578 newcount = self[elem] - other[elem]
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000579 if newcount > 0:
580 result[elem] = newcount
581 return result
582
583 def __or__(self, other):
584 '''Union is the maximum of value in either of the input counters.
585
586 >>> Counter('abbb') | Counter('bcc')
587 Counter({'b': 3, 'c': 2, 'a': 1})
588
589 '''
590 if not isinstance(other, Counter):
591 return NotImplemented
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000592 result = Counter()
593 for elem in set(self) | set(other):
Raymond Hettingerc4791702009-04-04 08:48:03 +0000594 p, q = self[elem], other[elem]
595 newcount = q if p < q else p
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000596 if newcount > 0:
597 result[elem] = newcount
598 return result
599
600 def __and__(self, other):
601 ''' Intersection is the minimum of corresponding counts.
602
603 >>> Counter('abbb') & Counter('bcc')
604 Counter({'b': 1})
605
606 '''
607 if not isinstance(other, Counter):
608 return NotImplemented
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000609 result = Counter()
610 if len(self) < len(other):
611 self, other = other, self
612 for elem in filter(self.__contains__, other):
Raymond Hettingerc4791702009-04-04 08:48:03 +0000613 p, q = self[elem], other[elem]
614 newcount = p if p < q else q
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000615 if newcount > 0:
616 result[elem] = newcount
617 return result
618
Guido van Rossumd8faa362007-04-27 19:54:29 +0000619
Raymond Hettinger48b8b662008-02-05 01:53:00 +0000620################################################################################
621### UserDict
622################################################################################
Guido van Rossumd8faa362007-04-27 19:54:29 +0000623
Raymond Hettinger48b8b662008-02-05 01:53:00 +0000624class UserDict(MutableMapping):
625
626 # Start by filling-out the abstract methods
627 def __init__(self, dict=None, **kwargs):
628 self.data = {}
629 if dict is not None:
630 self.update(dict)
631 if len(kwargs):
632 self.update(kwargs)
633 def __len__(self): return len(self.data)
634 def __getitem__(self, key):
635 if key in self.data:
636 return self.data[key]
637 if hasattr(self.__class__, "__missing__"):
638 return self.__class__.__missing__(self, key)
639 raise KeyError(key)
640 def __setitem__(self, key, item): self.data[key] = item
641 def __delitem__(self, key): del self.data[key]
642 def __iter__(self):
643 return iter(self.data)
644
Raymond Hettinger554c8b82008-02-05 22:54:43 +0000645 # Modify __contains__ to work correctly when __missing__ is present
646 def __contains__(self, key):
647 return key in self.data
Raymond Hettinger48b8b662008-02-05 01:53:00 +0000648
649 # Now, add the methods in dicts but not in MutableMapping
650 def __repr__(self): return repr(self.data)
651 def copy(self):
652 if self.__class__ is UserDict:
653 return UserDict(self.data.copy())
654 import copy
655 data = self.data
656 try:
657 self.data = {}
658 c = copy.copy(self)
659 finally:
660 self.data = data
661 c.update(self)
662 return c
663 @classmethod
664 def fromkeys(cls, iterable, value=None):
665 d = cls()
666 for key in iterable:
667 d[key] = value
668 return d
669
Raymond Hettinger48b8b662008-02-05 01:53:00 +0000670
671
672################################################################################
Raymond Hettinger53dbe392008-02-12 20:03:09 +0000673### UserList
674################################################################################
675
676class UserList(MutableSequence):
677 """A more or less complete user-defined wrapper around list objects."""
678 def __init__(self, initlist=None):
679 self.data = []
680 if initlist is not None:
681 # XXX should this accept an arbitrary sequence?
682 if type(initlist) == type(self.data):
683 self.data[:] = initlist
684 elif isinstance(initlist, UserList):
685 self.data[:] = initlist.data[:]
686 else:
687 self.data = list(initlist)
688 def __repr__(self): return repr(self.data)
689 def __lt__(self, other): return self.data < self.__cast(other)
690 def __le__(self, other): return self.data <= self.__cast(other)
691 def __eq__(self, other): return self.data == self.__cast(other)
692 def __ne__(self, other): return self.data != self.__cast(other)
693 def __gt__(self, other): return self.data > self.__cast(other)
694 def __ge__(self, other): return self.data >= self.__cast(other)
695 def __cast(self, other):
696 return other.data if isinstance(other, UserList) else other
Raymond Hettinger53dbe392008-02-12 20:03:09 +0000697 def __contains__(self, item): return item in self.data
698 def __len__(self): return len(self.data)
699 def __getitem__(self, i): return self.data[i]
700 def __setitem__(self, i, item): self.data[i] = item
701 def __delitem__(self, i): del self.data[i]
702 def __add__(self, other):
703 if isinstance(other, UserList):
704 return self.__class__(self.data + other.data)
705 elif isinstance(other, type(self.data)):
706 return self.__class__(self.data + other)
707 return self.__class__(self.data + list(other))
708 def __radd__(self, other):
709 if isinstance(other, UserList):
710 return self.__class__(other.data + self.data)
711 elif isinstance(other, type(self.data)):
712 return self.__class__(other + self.data)
713 return self.__class__(list(other) + self.data)
714 def __iadd__(self, other):
715 if isinstance(other, UserList):
716 self.data += other.data
717 elif isinstance(other, type(self.data)):
718 self.data += other
719 else:
720 self.data += list(other)
721 return self
722 def __mul__(self, n):
723 return self.__class__(self.data*n)
724 __rmul__ = __mul__
725 def __imul__(self, n):
726 self.data *= n
727 return self
728 def append(self, item): self.data.append(item)
729 def insert(self, i, item): self.data.insert(i, item)
730 def pop(self, i=-1): return self.data.pop(i)
731 def remove(self, item): self.data.remove(item)
732 def count(self, item): return self.data.count(item)
733 def index(self, item, *args): return self.data.index(item, *args)
734 def reverse(self): self.data.reverse()
735 def sort(self, *args, **kwds): self.data.sort(*args, **kwds)
736 def extend(self, other):
737 if isinstance(other, UserList):
738 self.data.extend(other.data)
739 else:
740 self.data.extend(other)
741
742
743
744################################################################################
Raymond Hettingerb3a65f82008-02-21 22:11:37 +0000745### UserString
746################################################################################
747
748class UserString(Sequence):
749 def __init__(self, seq):
750 if isinstance(seq, str):
751 self.data = seq
752 elif isinstance(seq, UserString):
753 self.data = seq.data[:]
754 else:
755 self.data = str(seq)
756 def __str__(self): return str(self.data)
757 def __repr__(self): return repr(self.data)
758 def __int__(self): return int(self.data)
Raymond Hettingerb3a65f82008-02-21 22:11:37 +0000759 def __float__(self): return float(self.data)
760 def __complex__(self): return complex(self.data)
761 def __hash__(self): return hash(self.data)
762
763 def __eq__(self, string):
764 if isinstance(string, UserString):
765 return self.data == string.data
766 return self.data == string
767 def __ne__(self, string):
768 if isinstance(string, UserString):
769 return self.data != string.data
770 return self.data != string
771 def __lt__(self, string):
772 if isinstance(string, UserString):
773 return self.data < string.data
774 return self.data < string
775 def __le__(self, string):
776 if isinstance(string, UserString):
777 return self.data <= string.data
778 return self.data <= string
779 def __gt__(self, string):
780 if isinstance(string, UserString):
781 return self.data > string.data
782 return self.data > string
783 def __ge__(self, string):
784 if isinstance(string, UserString):
785 return self.data >= string.data
786 return self.data >= string
787
788 def __contains__(self, char):
789 if isinstance(char, UserString):
790 char = char.data
791 return char in self.data
792
793 def __len__(self): return len(self.data)
794 def __getitem__(self, index): return self.__class__(self.data[index])
795 def __add__(self, other):
796 if isinstance(other, UserString):
797 return self.__class__(self.data + other.data)
798 elif isinstance(other, str):
799 return self.__class__(self.data + other)
800 return self.__class__(self.data + str(other))
801 def __radd__(self, other):
802 if isinstance(other, str):
803 return self.__class__(other + self.data)
804 return self.__class__(str(other) + self.data)
805 def __mul__(self, n):
806 return self.__class__(self.data*n)
807 __rmul__ = __mul__
808 def __mod__(self, args):
809 return self.__class__(self.data % args)
810
811 # the following methods are defined in alphabetical order:
812 def capitalize(self): return self.__class__(self.data.capitalize())
813 def center(self, width, *args):
814 return self.__class__(self.data.center(width, *args))
815 def count(self, sub, start=0, end=_sys.maxsize):
816 if isinstance(sub, UserString):
817 sub = sub.data
818 return self.data.count(sub, start, end)
819 def encode(self, encoding=None, errors=None): # XXX improve this?
820 if encoding:
821 if errors:
822 return self.__class__(self.data.encode(encoding, errors))
823 return self.__class__(self.data.encode(encoding))
824 return self.__class__(self.data.encode())
825 def endswith(self, suffix, start=0, end=_sys.maxsize):
826 return self.data.endswith(suffix, start, end)
827 def expandtabs(self, tabsize=8):
828 return self.__class__(self.data.expandtabs(tabsize))
829 def find(self, sub, start=0, end=_sys.maxsize):
830 if isinstance(sub, UserString):
831 sub = sub.data
832 return self.data.find(sub, start, end)
833 def format(self, *args, **kwds):
834 return self.data.format(*args, **kwds)
835 def index(self, sub, start=0, end=_sys.maxsize):
836 return self.data.index(sub, start, end)
837 def isalpha(self): return self.data.isalpha()
838 def isalnum(self): return self.data.isalnum()
839 def isdecimal(self): return self.data.isdecimal()
840 def isdigit(self): return self.data.isdigit()
841 def isidentifier(self): return self.data.isidentifier()
842 def islower(self): return self.data.islower()
843 def isnumeric(self): return self.data.isnumeric()
844 def isspace(self): return self.data.isspace()
845 def istitle(self): return self.data.istitle()
846 def isupper(self): return self.data.isupper()
847 def join(self, seq): return self.data.join(seq)
848 def ljust(self, width, *args):
849 return self.__class__(self.data.ljust(width, *args))
850 def lower(self): return self.__class__(self.data.lower())
851 def lstrip(self, chars=None): return self.__class__(self.data.lstrip(chars))
852 def partition(self, sep):
853 return self.data.partition(sep)
854 def replace(self, old, new, maxsplit=-1):
855 if isinstance(old, UserString):
856 old = old.data
857 if isinstance(new, UserString):
858 new = new.data
859 return self.__class__(self.data.replace(old, new, maxsplit))
860 def rfind(self, sub, start=0, end=_sys.maxsize):
Antoine Pitrouda2ecaf2010-01-02 21:40:36 +0000861 if isinstance(sub, UserString):
862 sub = sub.data
Raymond Hettingerb3a65f82008-02-21 22:11:37 +0000863 return self.data.rfind(sub, start, end)
864 def rindex(self, sub, start=0, end=_sys.maxsize):
865 return self.data.rindex(sub, start, end)
866 def rjust(self, width, *args):
867 return self.__class__(self.data.rjust(width, *args))
868 def rpartition(self, sep):
869 return self.data.rpartition(sep)
870 def rstrip(self, chars=None):
871 return self.__class__(self.data.rstrip(chars))
872 def split(self, sep=None, maxsplit=-1):
873 return self.data.split(sep, maxsplit)
874 def rsplit(self, sep=None, maxsplit=-1):
875 return self.data.rsplit(sep, maxsplit)
876 def splitlines(self, keepends=0): return self.data.splitlines(keepends)
877 def startswith(self, prefix, start=0, end=_sys.maxsize):
878 return self.data.startswith(prefix, start, end)
879 def strip(self, chars=None): return self.__class__(self.data.strip(chars))
880 def swapcase(self): return self.__class__(self.data.swapcase())
881 def title(self): return self.__class__(self.data.title())
882 def translate(self, *args):
883 return self.__class__(self.data.translate(*args))
884 def upper(self): return self.__class__(self.data.upper())
885 def zfill(self, width): return self.__class__(self.data.zfill(width))
886
887
888
889################################################################################
Raymond Hettinger48b8b662008-02-05 01:53:00 +0000890### Simple tests
891################################################################################
Guido van Rossumd8faa362007-04-27 19:54:29 +0000892
893if __name__ == '__main__':
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000894 # verify that instances can be pickled
Guido van Rossum99603b02007-07-20 00:22:32 +0000895 from pickle import loads, dumps
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000896 Point = namedtuple('Point', 'x, y', True)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000897 p = Point(x=10, y=20)
898 assert p == loads(dumps(p))
899
Guido van Rossum3d392eb2007-11-16 00:35:22 +0000900 # test and demonstrate ability to override methods
Christian Heimes043d6f62008-01-07 17:19:16 +0000901 class Point(namedtuple('Point', 'x y')):
Christian Heimes25bb7832008-01-11 16:17:00 +0000902 __slots__ = ()
Christian Heimes043d6f62008-01-07 17:19:16 +0000903 @property
904 def hypot(self):
905 return (self.x ** 2 + self.y ** 2) ** 0.5
Christian Heimes790c8232008-01-07 21:14:23 +0000906 def __str__(self):
Christian Heimes25bb7832008-01-11 16:17:00 +0000907 return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot)
Christian Heimes043d6f62008-01-07 17:19:16 +0000908
Christian Heimes25bb7832008-01-11 16:17:00 +0000909 for p in Point(3, 4), Point(14, 5/7.):
Christian Heimes790c8232008-01-07 21:14:23 +0000910 print (p)
Christian Heimes043d6f62008-01-07 17:19:16 +0000911
912 class Point(namedtuple('Point', 'x y')):
913 'Point class with optimized _make() and _replace() without error-checking'
Christian Heimes25bb7832008-01-11 16:17:00 +0000914 __slots__ = ()
Christian Heimes043d6f62008-01-07 17:19:16 +0000915 _make = classmethod(tuple.__new__)
916 def _replace(self, _map=map, **kwds):
Christian Heimes2380ac72008-01-09 00:17:24 +0000917 return self._make(_map(kwds.get, ('x', 'y'), self))
Christian Heimes043d6f62008-01-07 17:19:16 +0000918
919 print(Point(11, 22)._replace(x=100))
Guido van Rossum3d392eb2007-11-16 00:35:22 +0000920
Christian Heimes25bb7832008-01-11 16:17:00 +0000921 Point3D = namedtuple('Point3D', Point._fields + ('z',))
922 print(Point3D.__doc__)
923
Guido van Rossumd8faa362007-04-27 19:54:29 +0000924 import doctest
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000925 TestResults = namedtuple('TestResults', 'failed attempted')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000926 print(TestResults(*doctest.testmod()))