blob: 98c432575344e66900f9624a406f81280adc0559 [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 Hettinger345c49b2011-01-01 23:51:55 +000025class OrderedDict(dict):
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 Hettinger32062e92011-01-01 22:38:00 +000055 self.__update(*args, **kwds)
Raymond Hettinger2d32f632009-03-02 21:24:57 +000056
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 Hettinger32062e92011-01-01 22:38:00 +0000174 update = __update = MutableMapping.update
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000175 keys = MutableMapping.keys
176 values = MutableMapping.values
177 items = MutableMapping.items
Raymond Hettinger5be21b72010-08-01 22:10:57 +0000178 __ne__ = MutableMapping.__ne__
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000179
Raymond Hettinger345c49b2011-01-01 23:51:55 +0000180 __marker = object()
181
182 def pop(self, key, default=__marker):
183 if key in self:
184 result = self[key]
185 del self[key]
186 return result
187 if default is self.__marker:
188 raise KeyError(key)
189 return default
190
Raymond Hettingera673b1f2010-12-31 23:16:17 +0000191 def setdefault(self, key, default=None):
192 'OD.setdefault(k[,d]) -> OD.get(k,d), also set OD[k]=d if k not in OD'
193 if key in self:
194 return self[key]
195 self[key] = default
196 return default
197
Raymond Hettinger98a5f3f2010-09-13 21:36:00 +0000198 @_recursive_repr()
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000199 def __repr__(self):
Raymond Hettingerf04fa1b2009-04-08 01:15:02 +0000200 'od.__repr__() <==> repr(od)'
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000201 if not self:
202 return '%s()' % (self.__class__.__name__,)
Raymond Hettinger98a5f3f2010-09-13 21:36:00 +0000203 return '%s(%r)' % (self.__class__.__name__, list(self.items()))
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000204
205 def copy(self):
Raymond Hettingerf04fa1b2009-04-08 01:15:02 +0000206 'od.copy() -> a shallow copy of od'
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000207 return self.__class__(self)
208
209 @classmethod
210 def fromkeys(cls, iterable, value=None):
Raymond Hettingerf04fa1b2009-04-08 01:15:02 +0000211 '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
212 and values equal to v (which defaults to None).
213
214 '''
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000215 d = cls()
216 for key in iterable:
217 d[key] = value
218 return d
219
220 def __eq__(self, other):
Raymond Hettingerf04fa1b2009-04-08 01:15:02 +0000221 '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive
222 while comparison to a regular mapping is order-insensitive.
223
224 '''
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000225 if isinstance(other, OrderedDict):
Raymond Hettinger798ee1a2009-03-23 18:29:11 +0000226 return len(self)==len(other) and \
227 all(p==q for p, q in zip(self.items(), other.items()))
Raymond Hettinger2d32f632009-03-02 21:24:57 +0000228 return dict.__eq__(self, other)
229
Christian Heimes99170a52007-12-19 02:07:34 +0000230
Raymond Hettinger48b8b662008-02-05 01:53:00 +0000231################################################################################
232### namedtuple
233################################################################################
234
Benjamin Petersona86f2c02009-02-10 02:41:10 +0000235def namedtuple(typename, field_names, verbose=False, rename=False):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000236 """Returns a new subclass of tuple with named fields.
237
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000238 >>> Point = namedtuple('Point', 'x y')
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000239 >>> Point.__doc__ # docstring for the new class
Guido van Rossumd8faa362007-04-27 19:54:29 +0000240 'Point(x, y)'
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000241 >>> p = Point(11, y=22) # instantiate with positional args or keywords
Christian Heimes99170a52007-12-19 02:07:34 +0000242 >>> p[0] + p[1] # indexable like a plain tuple
Guido van Rossumd8faa362007-04-27 19:54:29 +0000243 33
Christian Heimes99170a52007-12-19 02:07:34 +0000244 >>> x, y = p # unpack like a regular tuple
Guido van Rossumd8faa362007-04-27 19:54:29 +0000245 >>> x, y
246 (11, 22)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000247 >>> p.x + p.y # fields also accessable by name
Guido van Rossumd8faa362007-04-27 19:54:29 +0000248 33
Christian Heimes0449f632007-12-15 01:27:15 +0000249 >>> d = p._asdict() # convert to a dictionary
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000250 >>> d['x']
251 11
252 >>> Point(**d) # convert from a dictionary
Guido van Rossumd8faa362007-04-27 19:54:29 +0000253 Point(x=11, y=22)
Christian Heimes0449f632007-12-15 01:27:15 +0000254 >>> p._replace(x=100) # _replace() is like str.replace() but targets named fields
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000255 Point(x=100, y=22)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000256
257 """
258
Christian Heimes2380ac72008-01-09 00:17:24 +0000259 # Parse and validate the field names. Validation serves two purposes,
260 # generating informative error messages and preventing template injection attacks.
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000261 if isinstance(field_names, str):
262 field_names = field_names.replace(',', ' ').split() # names separated by whitespace and/or commas
Benjamin Petersone9bbc8b2008-09-28 02:06:32 +0000263 field_names = tuple(map(str, field_names))
Benjamin Petersona86f2c02009-02-10 02:41:10 +0000264 if rename:
265 names = list(field_names)
266 seen = set()
267 for i, name in enumerate(names):
268 if (not all(c.isalnum() or c=='_' for c in name) or _iskeyword(name)
269 or not name or name[0].isdigit() or name.startswith('_')
270 or name in seen):
Raymond Hettinger56145242009-04-02 22:31:59 +0000271 names[i] = '_%d' % i
Benjamin Petersona86f2c02009-02-10 02:41:10 +0000272 seen.add(name)
273 field_names = tuple(names)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000274 for name in (typename,) + field_names:
Christian Heimesb9eccbf2007-12-05 20:18:38 +0000275 if not all(c.isalnum() or c=='_' for c in name):
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000276 raise ValueError('Type names and field names can only contain alphanumeric characters and underscores: %r' % name)
277 if _iskeyword(name):
278 raise ValueError('Type names and field names cannot be a keyword: %r' % name)
279 if name[0].isdigit():
280 raise ValueError('Type names and field names cannot start with a number: %r' % name)
281 seen_names = set()
282 for name in field_names:
Benjamin Petersona86f2c02009-02-10 02:41:10 +0000283 if name.startswith('_') and not rename:
Christian Heimes0449f632007-12-15 01:27:15 +0000284 raise ValueError('Field names cannot start with an underscore: %r' % name)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000285 if name in seen_names:
286 raise ValueError('Encountered duplicate field name: %r' % name)
287 seen_names.add(name)
288
289 # Create and fill-in the class template
Christian Heimesfaf2f632008-01-06 16:59:19 +0000290 numfields = len(field_names)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000291 argtxt = repr(field_names).replace("'", "")[1:-1] # tuple repr without parens or quotes
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000292 reprtxt = ', '.join('%s=%%r' % name for name in field_names)
293 template = '''class %(typename)s(tuple):
Christian Heimes0449f632007-12-15 01:27:15 +0000294 '%(typename)s(%(argtxt)s)' \n
295 __slots__ = () \n
Christian Heimesfaf2f632008-01-06 16:59:19 +0000296 _fields = %(field_names)r \n
Raymond Hettinger089ba7f2009-05-27 00:38:24 +0000297 def __new__(_cls, %(argtxt)s):
Raymond Hettinger7b0d3c62010-04-02 18:54:02 +0000298 'Create new instance of %(typename)s(%(argtxt)s)'
Raymond Hettinger089ba7f2009-05-27 00:38:24 +0000299 return _tuple.__new__(_cls, (%(argtxt)s)) \n
Christian Heimesfaf2f632008-01-06 16:59:19 +0000300 @classmethod
Christian Heimes043d6f62008-01-07 17:19:16 +0000301 def _make(cls, iterable, new=tuple.__new__, len=len):
Christian Heimesfaf2f632008-01-06 16:59:19 +0000302 'Make a new %(typename)s object from a sequence or iterable'
Christian Heimes043d6f62008-01-07 17:19:16 +0000303 result = new(cls, iterable)
Christian Heimesfaf2f632008-01-06 16:59:19 +0000304 if len(result) != %(numfields)d:
305 raise TypeError('Expected %(numfields)d arguments, got %%d' %% len(result))
306 return result \n
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000307 def __repr__(self):
Raymond Hettinger7b0d3c62010-04-02 18:54:02 +0000308 'Return a nicely formatted representation string'
Raymond Hettingerd331ce92010-08-08 01:13:42 +0000309 return self.__class__.__name__ + '(%(reprtxt)s)' %% self \n
Raymond Hettingera4f52b12009-03-02 22:28:31 +0000310 def _asdict(self):
311 'Return a new OrderedDict which maps field names to their values'
312 return OrderedDict(zip(self._fields, self)) \n
Raymond Hettinger089ba7f2009-05-27 00:38:24 +0000313 def _replace(_self, **kwds):
Guido van Rossum3d392eb2007-11-16 00:35:22 +0000314 'Return a new %(typename)s object replacing specified fields with new values'
Raymond Hettinger089ba7f2009-05-27 00:38:24 +0000315 result = _self._make(map(kwds.pop, %(field_names)r, _self))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000316 if kwds:
317 raise ValueError('Got unexpected field names: %%r' %% kwds.keys())
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000318 return result \n
319 def __getnewargs__(self):
Raymond Hettinger7b0d3c62010-04-02 18:54:02 +0000320 'Return self as a plain tuple. Used by copy and pickle.'
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000321 return tuple(self) \n\n''' % locals()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000322 for i, name in enumerate(field_names):
Raymond Hettinger7b0d3c62010-04-02 18:54:02 +0000323 template += " %s = _property(_itemgetter(%d), doc='Alias for field number %d')\n" % (name, i, i)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000324 if verbose:
325 print(template)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000326
Georg Brandlf08a9dd2008-06-10 16:57:31 +0000327 # Execute the template string in a temporary namespace and
328 # support tracing utilities by setting a value for frame.f_globals['__name__']
Raymond Hettinger089ba7f2009-05-27 00:38:24 +0000329 namespace = dict(_itemgetter=_itemgetter, __name__='namedtuple_%s' % typename,
330 OrderedDict=OrderedDict, _property=property, _tuple=tuple)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000331 try:
332 exec(template, namespace)
333 except SyntaxError as e:
Raymond Hettingerc1cc0d02010-09-16 08:06:05 +0000334 raise SyntaxError(e.msg + ':\n\n' + template)
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000335 result = namespace[typename]
336
337 # For pickling to work, the __module__ variable needs to be set to the frame
338 # where the named tuple is created. Bypass this step in enviroments where
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000339 # sys._getframe is not defined (Jython for example) or sys._getframe is not
340 # defined for arguments greater than 0 (IronPython).
341 try:
Raymond Hettinger0f055172009-01-27 10:06:09 +0000342 result.__module__ = _sys._getframe(1).f_globals.get('__name__', '__main__')
Benjamin Peterson25c95f12009-05-08 20:42:26 +0000343 except (AttributeError, ValueError):
344 pass
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000345
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000346 return result
Guido van Rossumd8faa362007-04-27 19:54:29 +0000347
Guido van Rossumd8faa362007-04-27 19:54:29 +0000348
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000349########################################################################
350### Counter
351########################################################################
352
Raymond Hettinger96f34102010-12-15 16:30:37 +0000353def _count_elements(mapping, iterable):
354 'Tally elements from the iterable.'
355 mapping_get = mapping.get
356 for elem in iterable:
357 mapping[elem] = mapping_get(elem, 0) + 1
358
359try: # Load C helper function if available
360 from _collections import _count_elements
361except ImportError:
362 pass
363
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000364class Counter(dict):
365 '''Dict subclass for counting hashable items. Sometimes called a bag
366 or multiset. Elements are stored as dictionary keys and their counts
367 are stored as dictionary values.
368
Raymond Hettinger00d43fd2011-01-02 08:03:33 +0000369 >>> c = Counter('abcdeabcdabcaba') # count elements from a string
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000370
371 >>> c.most_common(3) # three most common elements
Raymond Hettinger00d43fd2011-01-02 08:03:33 +0000372 [('a', 5), ('b', 4), ('c', 3)]
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000373 >>> sorted(c) # list all unique elements
Raymond Hettinger00d43fd2011-01-02 08:03:33 +0000374 ['a', 'b', 'c', 'd', 'e']
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000375 >>> ''.join(sorted(c.elements())) # list elements with repetitions
Raymond Hettinger00d43fd2011-01-02 08:03:33 +0000376 'aaaaabbbbcccdde'
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000377 >>> sum(c.values()) # total of all counts
Raymond Hettinger00d43fd2011-01-02 08:03:33 +0000378 15
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000379
380 >>> c['a'] # count of letter 'a'
381 5
382 >>> for elem in 'shazam': # update counts from an iterable
383 ... c[elem] += 1 # by adding 1 to each element's count
384 >>> c['a'] # now there are seven 'a'
385 7
Raymond Hettinger00d43fd2011-01-02 08:03:33 +0000386 >>> del c['b'] # remove all 'b'
387 >>> c['b'] # now there are zero 'b'
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000388 0
389
390 >>> d = Counter('simsalabim') # make another counter
391 >>> c.update(d) # add in the second counter
392 >>> c['a'] # now there are nine 'a'
393 9
394
395 >>> c.clear() # empty the counter
396 >>> c
397 Counter()
398
399 Note: If a count is set to zero or reduced to zero, it will remain
400 in the counter until the entry is deleted or the counter is cleared:
401
402 >>> c = Counter('aaabbc')
403 >>> c['b'] -= 2 # reduce the count of 'b' by two
404 >>> c.most_common() # 'b' is still in, but its count is zero
405 [('a', 3), ('c', 1), ('b', 0)]
406
407 '''
408 # References:
409 # http://en.wikipedia.org/wiki/Multiset
410 # http://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html
411 # http://www.demo2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm
412 # http://code.activestate.com/recipes/259174/
413 # Knuth, TAOCP Vol. II section 4.6.3
414
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000415 def __init__(self, iterable=None, **kwds):
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000416 '''Create a new, empty Counter object. And if given, count elements
417 from an input iterable. Or, initialize the count from another mapping
418 of elements to their counts.
419
420 >>> c = Counter() # a new, empty counter
421 >>> c = Counter('gallahad') # a new counter from an iterable
422 >>> c = Counter({'a': 4, 'b': 2}) # a new counter from a mapping
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000423 >>> c = Counter(a=4, b=2) # a new counter from keyword args
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000424
425 '''
Raymond Hettinger00d43fd2011-01-02 08:03:33 +0000426 super().__init__()
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000427 self.update(iterable, **kwds)
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000428
429 def __missing__(self, key):
430 'The count of elements not in the Counter is zero.'
431 # Needed so that self[missing_item] does not raise KeyError
432 return 0
433
434 def most_common(self, n=None):
435 '''List the n most common elements and their counts from the most
436 common to the least. If n is None, then list all element counts.
437
Raymond Hettinger00d43fd2011-01-02 08:03:33 +0000438 >>> Counter('abcdeabcdabcaba').most_common(3)
439 [('a', 5), ('b', 4), ('c', 3)]
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000440
441 '''
442 # Emulate Bag.sortedByCount from Smalltalk
443 if n is None:
444 return sorted(self.items(), key=_itemgetter(1), reverse=True)
445 return _heapq.nlargest(n, self.items(), key=_itemgetter(1))
446
447 def elements(self):
448 '''Iterator over elements repeating each as many times as its count.
449
450 >>> c = Counter('ABCABC')
451 >>> sorted(c.elements())
452 ['A', 'A', 'B', 'B', 'C', 'C']
453
454 # Knuth's example for prime factors of 1836: 2**2 * 3**3 * 17**1
455 >>> prime_factors = Counter({2: 2, 3: 3, 17: 1})
456 >>> product = 1
457 >>> for factor in prime_factors.elements(): # loop over factors
458 ... product *= factor # and multiply them
459 >>> product
460 1836
461
462 Note, if an element's count has been set to zero or is a negative
463 number, elements() will ignore it.
464
465 '''
466 # Emulate Bag.do from Smalltalk and Multiset.begin from C++.
467 return _chain.from_iterable(_starmap(_repeat, self.items()))
468
469 # Override dict methods where necessary
470
471 @classmethod
472 def fromkeys(cls, iterable, v=None):
473 # There is no equivalent method for counters because setting v=1
474 # means that no element can have a count greater than one.
475 raise NotImplementedError(
476 'Counter.fromkeys() is undefined. Use Counter(iterable) instead.')
477
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000478 def update(self, iterable=None, **kwds):
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000479 '''Like dict.update() but add counts instead of replacing them.
480
481 Source can be an iterable, a dictionary, or another Counter instance.
482
483 >>> c = Counter('which')
484 >>> c.update('witch') # add elements from another iterable
485 >>> d = Counter('watch')
486 >>> c.update(d) # add elements from another counter
487 >>> c['h'] # four 'h' in which, witch, and watch
488 4
489
490 '''
491 # The regular dict.update() operation makes no sense here because the
492 # replace behavior results in the some of original untouched counts
493 # being mixed-in with all of the other counts for a mismash that
494 # doesn't have a straight-forward interpretation in most counting
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000495 # contexts. Instead, we implement straight-addition. Both the inputs
496 # and outputs are allowed to contain zero and negative counts.
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000497
498 if iterable is not None:
499 if isinstance(iterable, Mapping):
Raymond Hettingerdd01f8f2009-01-22 09:09:55 +0000500 if self:
Raymond Hettingerf9092022009-06-29 18:30:43 +0000501 self_get = self.get
Raymond Hettingerdd01f8f2009-01-22 09:09:55 +0000502 for elem, count in iterable.items():
Raymond Hettingerf9092022009-06-29 18:30:43 +0000503 self[elem] = count + self_get(elem, 0)
Raymond Hettingerdd01f8f2009-01-22 09:09:55 +0000504 else:
Raymond Hettinger00d43fd2011-01-02 08:03:33 +0000505 super().update(iterable) # fast path when counter is empty
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000506 else:
Raymond Hettinger96f34102010-12-15 16:30:37 +0000507 _count_elements(self, iterable)
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000508 if kwds:
509 self.update(kwds)
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000510
Raymond Hettinger9c01e442010-04-03 10:32:58 +0000511 def subtract(self, iterable=None, **kwds):
512 '''Like dict.update() but subtracts counts instead of replacing them.
513 Counts can be reduced below zero. Both the inputs and outputs are
514 allowed to contain zero and negative counts.
515
516 Source can be an iterable, a dictionary, or another Counter instance.
517
518 >>> c = Counter('which')
519 >>> c.subtract('witch') # subtract elements from another iterable
520 >>> c.subtract(Counter('watch')) # subtract elements from another counter
521 >>> c['h'] # 2 in which, minus 1 in witch, minus 1 in watch
522 0
523 >>> c['w'] # 1 in which, minus 1 in witch, minus 1 in watch
524 -1
525
526 '''
527 if iterable is not None:
Raymond Hettingerfc3c9cd2010-04-11 20:41:56 +0000528 self_get = self.get
Raymond Hettinger9c01e442010-04-03 10:32:58 +0000529 if isinstance(iterable, Mapping):
Raymond Hettinger9c01e442010-04-03 10:32:58 +0000530 for elem, count in iterable.items():
531 self[elem] = self_get(elem, 0) - count
532 else:
Raymond Hettinger9c01e442010-04-03 10:32:58 +0000533 for elem in iterable:
534 self[elem] = self_get(elem, 0) - 1
535 if kwds:
536 self.subtract(kwds)
537
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000538 def copy(self):
539 'Like dict.copy() but returns a Counter instance instead of a dict.'
540 return Counter(self)
541
Raymond Hettingerff728162011-01-03 02:44:14 +0000542 def __reduce__(self):
543 return self.__class__, (dict(self),)
544
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000545 def __delitem__(self, elem):
546 'Like dict.__delitem__() but does not raise KeyError for missing values.'
547 if elem in self:
Raymond Hettinger00d43fd2011-01-02 08:03:33 +0000548 super().__delitem__(elem)
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000549
Raymond Hettingerb8baf632009-01-14 02:20:07 +0000550 def __repr__(self):
551 if not self:
552 return '%s()' % self.__class__.__name__
553 items = ', '.join(map('%r: %r'.__mod__, self.most_common()))
554 return '%s({%s})' % (self.__class__.__name__, items)
555
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000556 # Multiset-style mathematical operations discussed in:
557 # Knuth TAOCP Volume II section 4.6.3 exercise 19
558 # and at http://en.wikipedia.org/wiki/Multiset
559 #
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000560 # Outputs guaranteed to only include positive counts.
561 #
562 # To strip negative and zero counts, add-in an empty counter:
563 # c += Counter()
564
565 def __add__(self, other):
566 '''Add counts from two counters.
567
568 >>> Counter('abbb') + Counter('bcc')
569 Counter({'b': 4, 'c': 2, 'a': 1})
570
571 '''
572 if not isinstance(other, Counter):
573 return NotImplemented
574 result = Counter()
575 for elem in set(self) | set(other):
576 newcount = self[elem] + other[elem]
577 if newcount > 0:
578 result[elem] = newcount
579 return result
580
581 def __sub__(self, other):
582 ''' Subtract count, but keep only results with positive counts.
583
584 >>> Counter('abbbc') - Counter('bccd')
585 Counter({'b': 2, 'a': 1})
586
587 '''
588 if not isinstance(other, Counter):
589 return NotImplemented
590 result = Counter()
Raymond Hettingere0d1b9f2009-01-21 20:36:27 +0000591 for elem in set(self) | set(other):
592 newcount = self[elem] - other[elem]
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000593 if newcount > 0:
594 result[elem] = newcount
595 return result
596
597 def __or__(self, other):
598 '''Union is the maximum of value in either of the input counters.
599
600 >>> Counter('abbb') | Counter('bcc')
601 Counter({'b': 3, 'c': 2, 'a': 1})
602
603 '''
604 if not isinstance(other, Counter):
605 return NotImplemented
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000606 result = Counter()
607 for elem in set(self) | set(other):
Raymond Hettingerc4791702009-04-04 08:48:03 +0000608 p, q = self[elem], other[elem]
609 newcount = q if p < q else p
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000610 if newcount > 0:
611 result[elem] = newcount
612 return result
613
614 def __and__(self, other):
615 ''' Intersection is the minimum of corresponding counts.
616
617 >>> Counter('abbb') & Counter('bcc')
618 Counter({'b': 1})
619
620 '''
621 if not isinstance(other, Counter):
622 return NotImplemented
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000623 result = Counter()
624 if len(self) < len(other):
625 self, other = other, self
626 for elem in filter(self.__contains__, other):
Raymond Hettingerc4791702009-04-04 08:48:03 +0000627 p, q = self[elem], other[elem]
628 newcount = p if p < q else q
Raymond Hettinger4d2073a2009-01-20 03:41:22 +0000629 if newcount > 0:
630 result[elem] = newcount
631 return result
632
Guido van Rossumd8faa362007-04-27 19:54:29 +0000633
Raymond Hettingere6603602011-02-21 19:38:53 +0000634########################################################################
635### ChainMap (helper for configparser)
636########################################################################
637
638class _ChainMap(MutableMapping):
639 ''' A ChainMap groups multiple dicts (or other mappings) together
640 to create a single, updateable view.
641
642 The underlying mappings are stored in a list. That list is public and can
643 accessed or updated using the *maps* attribute. There is no other state.
644
645 Lookups search the underlying mappings successively until a key is found.
646 In contrast, writes, updates, and deletions only operate on the first
647 mapping.
648
649 '''
650
651 def __init__(self, *maps):
652 '''Initialize a ChainMap by setting *maps* to the given mappings.
653 If no mappings are provided, a single empty dictionary is used.
654
655 '''
656 self.maps = list(maps) or [{}] # always at least one map
657
658 def __missing__(self, key):
659 raise KeyError(key)
660
661 def __getitem__(self, key):
662 for mapping in self.maps:
663 try:
664 return mapping[key] # can't use 'key in mapping' with defaultdict
665 except KeyError:
666 pass
667 return self.__missing__(key) # support subclasses that define __missing__
668
669 def get(self, key, default=None):
670 return self[key] if key in self else default
671
672 def __len__(self):
673 return len(set().union(*self.maps)) # reuses stored hash values if possible
674
675 def __iter__(self):
676 return iter(set().union(*self.maps))
677
678 def __contains__(self, key):
679 return any(key in m for m in self.maps)
680
681 @_recursive_repr()
682 def __repr__(self):
683 return '{0.__class__.__name__}({1})'.format(
684 self, ', '.join(map(repr, self.maps)))
685
686 @classmethod
687 def fromkeys(cls, iterable, *args):
688 'Create a ChainMap with a single dict created from the iterable.'
689 return cls(dict.fromkeys(iterable, *args))
690
691 def copy(self):
692 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]'
693 return self.__class__(self.maps[0].copy(), *self.maps[1:])
694
695 __copy__ = copy
696
Raymond Hettingerdcb29c92011-02-23 08:28:06 +0000697 def new_child(self): # like Django's Context.push()
698 'New ChainMap with a new dict followed by all previous maps.'
699 return self.__class__({}, *self.maps)
700
701 @property
702 def parents(self): # like Django's Context.pop()
703 'New ChainMap from maps[1:].'
704 return self.__class__(*self.maps[1:])
705
Raymond Hettingere6603602011-02-21 19:38:53 +0000706 def __setitem__(self, key, value):
707 self.maps[0][key] = value
708
709 def __delitem__(self, key):
710 try:
711 del self.maps[0][key]
712 except KeyError:
713 raise KeyError('Key not found in the first mapping: {!r}'.format(key))
714
715 def popitem(self):
716 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.'
717 try:
718 return self.maps[0].popitem()
719 except KeyError:
720 raise KeyError('No keys found in the first mapping.')
721
722 def pop(self, key, *args):
723 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].'
724 try:
725 return self.maps[0].pop(key, *args)
726 except KeyError:
727 raise KeyError('Key not found in the first mapping: {!r}'.format(key))
728
729 def clear(self):
730 'Clear maps[0], leaving maps[1:] intact.'
731 self.maps[0].clear()
732
733
Raymond Hettinger48b8b662008-02-05 01:53:00 +0000734################################################################################
735### UserDict
736################################################################################
Guido van Rossumd8faa362007-04-27 19:54:29 +0000737
Raymond Hettinger48b8b662008-02-05 01:53:00 +0000738class UserDict(MutableMapping):
739
740 # Start by filling-out the abstract methods
741 def __init__(self, dict=None, **kwargs):
742 self.data = {}
743 if dict is not None:
744 self.update(dict)
745 if len(kwargs):
746 self.update(kwargs)
747 def __len__(self): return len(self.data)
748 def __getitem__(self, key):
749 if key in self.data:
750 return self.data[key]
751 if hasattr(self.__class__, "__missing__"):
752 return self.__class__.__missing__(self, key)
753 raise KeyError(key)
754 def __setitem__(self, key, item): self.data[key] = item
755 def __delitem__(self, key): del self.data[key]
756 def __iter__(self):
757 return iter(self.data)
758
Raymond Hettinger554c8b82008-02-05 22:54:43 +0000759 # Modify __contains__ to work correctly when __missing__ is present
760 def __contains__(self, key):
761 return key in self.data
Raymond Hettinger48b8b662008-02-05 01:53:00 +0000762
763 # Now, add the methods in dicts but not in MutableMapping
764 def __repr__(self): return repr(self.data)
765 def copy(self):
766 if self.__class__ is UserDict:
767 return UserDict(self.data.copy())
768 import copy
769 data = self.data
770 try:
771 self.data = {}
772 c = copy.copy(self)
773 finally:
774 self.data = data
775 c.update(self)
776 return c
777 @classmethod
778 def fromkeys(cls, iterable, value=None):
779 d = cls()
780 for key in iterable:
781 d[key] = value
782 return d
783
Raymond Hettinger48b8b662008-02-05 01:53:00 +0000784
785
786################################################################################
Raymond Hettinger53dbe392008-02-12 20:03:09 +0000787### UserList
788################################################################################
789
790class UserList(MutableSequence):
791 """A more or less complete user-defined wrapper around list objects."""
792 def __init__(self, initlist=None):
793 self.data = []
794 if initlist is not None:
795 # XXX should this accept an arbitrary sequence?
796 if type(initlist) == type(self.data):
797 self.data[:] = initlist
798 elif isinstance(initlist, UserList):
799 self.data[:] = initlist.data[:]
800 else:
801 self.data = list(initlist)
802 def __repr__(self): return repr(self.data)
803 def __lt__(self, other): return self.data < self.__cast(other)
804 def __le__(self, other): return self.data <= self.__cast(other)
805 def __eq__(self, other): return self.data == self.__cast(other)
806 def __ne__(self, other): return self.data != self.__cast(other)
807 def __gt__(self, other): return self.data > self.__cast(other)
808 def __ge__(self, other): return self.data >= self.__cast(other)
809 def __cast(self, other):
810 return other.data if isinstance(other, UserList) else other
Raymond Hettinger53dbe392008-02-12 20:03:09 +0000811 def __contains__(self, item): return item in self.data
812 def __len__(self): return len(self.data)
813 def __getitem__(self, i): return self.data[i]
814 def __setitem__(self, i, item): self.data[i] = item
815 def __delitem__(self, i): del self.data[i]
816 def __add__(self, other):
817 if isinstance(other, UserList):
818 return self.__class__(self.data + other.data)
819 elif isinstance(other, type(self.data)):
820 return self.__class__(self.data + other)
821 return self.__class__(self.data + list(other))
822 def __radd__(self, other):
823 if isinstance(other, UserList):
824 return self.__class__(other.data + self.data)
825 elif isinstance(other, type(self.data)):
826 return self.__class__(other + self.data)
827 return self.__class__(list(other) + self.data)
828 def __iadd__(self, other):
829 if isinstance(other, UserList):
830 self.data += other.data
831 elif isinstance(other, type(self.data)):
832 self.data += other
833 else:
834 self.data += list(other)
835 return self
836 def __mul__(self, n):
837 return self.__class__(self.data*n)
838 __rmul__ = __mul__
839 def __imul__(self, n):
840 self.data *= n
841 return self
842 def append(self, item): self.data.append(item)
843 def insert(self, i, item): self.data.insert(i, item)
844 def pop(self, i=-1): return self.data.pop(i)
845 def remove(self, item): self.data.remove(item)
846 def count(self, item): return self.data.count(item)
847 def index(self, item, *args): return self.data.index(item, *args)
848 def reverse(self): self.data.reverse()
849 def sort(self, *args, **kwds): self.data.sort(*args, **kwds)
850 def extend(self, other):
851 if isinstance(other, UserList):
852 self.data.extend(other.data)
853 else:
854 self.data.extend(other)
855
856
857
858################################################################################
Raymond Hettingerb3a65f82008-02-21 22:11:37 +0000859### UserString
860################################################################################
861
862class UserString(Sequence):
863 def __init__(self, seq):
864 if isinstance(seq, str):
865 self.data = seq
866 elif isinstance(seq, UserString):
867 self.data = seq.data[:]
868 else:
869 self.data = str(seq)
870 def __str__(self): return str(self.data)
871 def __repr__(self): return repr(self.data)
872 def __int__(self): return int(self.data)
Raymond Hettingerb3a65f82008-02-21 22:11:37 +0000873 def __float__(self): return float(self.data)
874 def __complex__(self): return complex(self.data)
875 def __hash__(self): return hash(self.data)
876
877 def __eq__(self, string):
878 if isinstance(string, UserString):
879 return self.data == string.data
880 return self.data == string
881 def __ne__(self, string):
882 if isinstance(string, UserString):
883 return self.data != string.data
884 return self.data != string
885 def __lt__(self, string):
886 if isinstance(string, UserString):
887 return self.data < string.data
888 return self.data < string
889 def __le__(self, string):
890 if isinstance(string, UserString):
891 return self.data <= string.data
892 return self.data <= string
893 def __gt__(self, string):
894 if isinstance(string, UserString):
895 return self.data > string.data
896 return self.data > string
897 def __ge__(self, string):
898 if isinstance(string, UserString):
899 return self.data >= string.data
900 return self.data >= string
901
902 def __contains__(self, char):
903 if isinstance(char, UserString):
904 char = char.data
905 return char in self.data
906
907 def __len__(self): return len(self.data)
908 def __getitem__(self, index): return self.__class__(self.data[index])
909 def __add__(self, other):
910 if isinstance(other, UserString):
911 return self.__class__(self.data + other.data)
912 elif isinstance(other, str):
913 return self.__class__(self.data + other)
914 return self.__class__(self.data + str(other))
915 def __radd__(self, other):
916 if isinstance(other, str):
917 return self.__class__(other + self.data)
918 return self.__class__(str(other) + self.data)
919 def __mul__(self, n):
920 return self.__class__(self.data*n)
921 __rmul__ = __mul__
922 def __mod__(self, args):
923 return self.__class__(self.data % args)
924
925 # the following methods are defined in alphabetical order:
926 def capitalize(self): return self.__class__(self.data.capitalize())
927 def center(self, width, *args):
928 return self.__class__(self.data.center(width, *args))
929 def count(self, sub, start=0, end=_sys.maxsize):
930 if isinstance(sub, UserString):
931 sub = sub.data
932 return self.data.count(sub, start, end)
933 def encode(self, encoding=None, errors=None): # XXX improve this?
934 if encoding:
935 if errors:
936 return self.__class__(self.data.encode(encoding, errors))
937 return self.__class__(self.data.encode(encoding))
938 return self.__class__(self.data.encode())
939 def endswith(self, suffix, start=0, end=_sys.maxsize):
940 return self.data.endswith(suffix, start, end)
941 def expandtabs(self, tabsize=8):
942 return self.__class__(self.data.expandtabs(tabsize))
943 def find(self, sub, start=0, end=_sys.maxsize):
944 if isinstance(sub, UserString):
945 sub = sub.data
946 return self.data.find(sub, start, end)
947 def format(self, *args, **kwds):
948 return self.data.format(*args, **kwds)
949 def index(self, sub, start=0, end=_sys.maxsize):
950 return self.data.index(sub, start, end)
951 def isalpha(self): return self.data.isalpha()
952 def isalnum(self): return self.data.isalnum()
953 def isdecimal(self): return self.data.isdecimal()
954 def isdigit(self): return self.data.isdigit()
955 def isidentifier(self): return self.data.isidentifier()
956 def islower(self): return self.data.islower()
957 def isnumeric(self): return self.data.isnumeric()
958 def isspace(self): return self.data.isspace()
959 def istitle(self): return self.data.istitle()
960 def isupper(self): return self.data.isupper()
961 def join(self, seq): return self.data.join(seq)
962 def ljust(self, width, *args):
963 return self.__class__(self.data.ljust(width, *args))
964 def lower(self): return self.__class__(self.data.lower())
965 def lstrip(self, chars=None): return self.__class__(self.data.lstrip(chars))
966 def partition(self, sep):
967 return self.data.partition(sep)
968 def replace(self, old, new, maxsplit=-1):
969 if isinstance(old, UserString):
970 old = old.data
971 if isinstance(new, UserString):
972 new = new.data
973 return self.__class__(self.data.replace(old, new, maxsplit))
974 def rfind(self, sub, start=0, end=_sys.maxsize):
Antoine Pitrouda2ecaf2010-01-02 21:40:36 +0000975 if isinstance(sub, UserString):
976 sub = sub.data
Raymond Hettingerb3a65f82008-02-21 22:11:37 +0000977 return self.data.rfind(sub, start, end)
978 def rindex(self, sub, start=0, end=_sys.maxsize):
979 return self.data.rindex(sub, start, end)
980 def rjust(self, width, *args):
981 return self.__class__(self.data.rjust(width, *args))
982 def rpartition(self, sep):
983 return self.data.rpartition(sep)
984 def rstrip(self, chars=None):
985 return self.__class__(self.data.rstrip(chars))
986 def split(self, sep=None, maxsplit=-1):
987 return self.data.split(sep, maxsplit)
988 def rsplit(self, sep=None, maxsplit=-1):
989 return self.data.rsplit(sep, maxsplit)
990 def splitlines(self, keepends=0): return self.data.splitlines(keepends)
991 def startswith(self, prefix, start=0, end=_sys.maxsize):
992 return self.data.startswith(prefix, start, end)
993 def strip(self, chars=None): return self.__class__(self.data.strip(chars))
994 def swapcase(self): return self.__class__(self.data.swapcase())
995 def title(self): return self.__class__(self.data.title())
996 def translate(self, *args):
997 return self.__class__(self.data.translate(*args))
998 def upper(self): return self.__class__(self.data.upper())
999 def zfill(self, width): return self.__class__(self.data.zfill(width))
1000
1001
1002
1003################################################################################
Raymond Hettinger48b8b662008-02-05 01:53:00 +00001004### Simple tests
1005################################################################################
Guido van Rossumd8faa362007-04-27 19:54:29 +00001006
1007if __name__ == '__main__':
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001008 # verify that instances can be pickled
Guido van Rossum99603b02007-07-20 00:22:32 +00001009 from pickle import loads, dumps
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001010 Point = namedtuple('Point', 'x, y', True)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001011 p = Point(x=10, y=20)
1012 assert p == loads(dumps(p))
1013
Guido van Rossum3d392eb2007-11-16 00:35:22 +00001014 # test and demonstrate ability to override methods
Christian Heimes043d6f62008-01-07 17:19:16 +00001015 class Point(namedtuple('Point', 'x y')):
Christian Heimes25bb7832008-01-11 16:17:00 +00001016 __slots__ = ()
Christian Heimes043d6f62008-01-07 17:19:16 +00001017 @property
1018 def hypot(self):
1019 return (self.x ** 2 + self.y ** 2) ** 0.5
Christian Heimes790c8232008-01-07 21:14:23 +00001020 def __str__(self):
Christian Heimes25bb7832008-01-11 16:17:00 +00001021 return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot)
Christian Heimes043d6f62008-01-07 17:19:16 +00001022
Christian Heimes25bb7832008-01-11 16:17:00 +00001023 for p in Point(3, 4), Point(14, 5/7.):
Christian Heimes790c8232008-01-07 21:14:23 +00001024 print (p)
Christian Heimes043d6f62008-01-07 17:19:16 +00001025
1026 class Point(namedtuple('Point', 'x y')):
1027 'Point class with optimized _make() and _replace() without error-checking'
Christian Heimes25bb7832008-01-11 16:17:00 +00001028 __slots__ = ()
Christian Heimes043d6f62008-01-07 17:19:16 +00001029 _make = classmethod(tuple.__new__)
1030 def _replace(self, _map=map, **kwds):
Christian Heimes2380ac72008-01-09 00:17:24 +00001031 return self._make(_map(kwds.get, ('x', 'y'), self))
Christian Heimes043d6f62008-01-07 17:19:16 +00001032
1033 print(Point(11, 22)._replace(x=100))
Guido van Rossum3d392eb2007-11-16 00:35:22 +00001034
Christian Heimes25bb7832008-01-11 16:17:00 +00001035 Point3D = namedtuple('Point3D', Point._fields + ('z',))
1036 print(Point3D.__doc__)
1037
Guido van Rossumd8faa362007-04-27 19:54:29 +00001038 import doctest
Guido van Rossum8ce8a782007-11-01 19:42:39 +00001039 TestResults = namedtuple('TestResults', 'failed attempted')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001040 print(TestResults(*doctest.testmod()))