17db96d56Sopenharmony_ci:mod:`collections` --- Container datatypes 27db96d56Sopenharmony_ci========================================== 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci.. module:: collections 57db96d56Sopenharmony_ci :synopsis: Container datatypes 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci.. moduleauthor:: Raymond Hettinger <python@rcn.com> 87db96d56Sopenharmony_ci.. sectionauthor:: Raymond Hettinger <python@rcn.com> 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ci**Source code:** :source:`Lib/collections/__init__.py` 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ci.. testsetup:: * 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ci from collections import * 157db96d56Sopenharmony_ci import itertools 167db96d56Sopenharmony_ci __name__ = '<doctest>' 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ci-------------- 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ciThis module implements specialized container datatypes providing alternatives to 217db96d56Sopenharmony_ciPython's general purpose built-in containers, :class:`dict`, :class:`list`, 227db96d56Sopenharmony_ci:class:`set`, and :class:`tuple`. 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci===================== ==================================================================== 257db96d56Sopenharmony_ci:func:`namedtuple` factory function for creating tuple subclasses with named fields 267db96d56Sopenharmony_ci:class:`deque` list-like container with fast appends and pops on either end 277db96d56Sopenharmony_ci:class:`ChainMap` dict-like class for creating a single view of multiple mappings 287db96d56Sopenharmony_ci:class:`Counter` dict subclass for counting :term:`hashable` objects 297db96d56Sopenharmony_ci:class:`OrderedDict` dict subclass that remembers the order entries were added 307db96d56Sopenharmony_ci:class:`defaultdict` dict subclass that calls a factory function to supply missing values 317db96d56Sopenharmony_ci:class:`UserDict` wrapper around dictionary objects for easier dict subclassing 327db96d56Sopenharmony_ci:class:`UserList` wrapper around list objects for easier list subclassing 337db96d56Sopenharmony_ci:class:`UserString` wrapper around string objects for easier string subclassing 347db96d56Sopenharmony_ci===================== ==================================================================== 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_ci:class:`ChainMap` objects 387db96d56Sopenharmony_ci------------------------- 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci.. versionadded:: 3.3 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ciA :class:`ChainMap` class is provided for quickly linking a number of mappings 437db96d56Sopenharmony_ciso they can be treated as a single unit. It is often much faster than creating 447db96d56Sopenharmony_cia new dictionary and running multiple :meth:`~dict.update` calls. 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ciThe class can be used to simulate nested scopes and is useful in templating. 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci.. class:: ChainMap(*maps) 497db96d56Sopenharmony_ci 507db96d56Sopenharmony_ci A :class:`ChainMap` groups multiple dicts or other mappings together to 517db96d56Sopenharmony_ci create a single, updateable view. If no *maps* are specified, a single empty 527db96d56Sopenharmony_ci dictionary is provided so that a new chain always has at least one mapping. 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci The underlying mappings are stored in a list. That list is public and can 557db96d56Sopenharmony_ci be accessed or updated using the *maps* attribute. There is no other state. 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci Lookups search the underlying mappings successively until a key is found. In 587db96d56Sopenharmony_ci contrast, writes, updates, and deletions only operate on the first mapping. 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ci A :class:`ChainMap` incorporates the underlying mappings by reference. So, if 617db96d56Sopenharmony_ci one of the underlying mappings gets updated, those changes will be reflected 627db96d56Sopenharmony_ci in :class:`ChainMap`. 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_ci All of the usual dictionary methods are supported. In addition, there is a 657db96d56Sopenharmony_ci *maps* attribute, a method for creating new subcontexts, and a property for 667db96d56Sopenharmony_ci accessing all but the first mapping: 677db96d56Sopenharmony_ci 687db96d56Sopenharmony_ci .. attribute:: maps 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci A user updateable list of mappings. The list is ordered from 717db96d56Sopenharmony_ci first-searched to last-searched. It is the only stored state and can 727db96d56Sopenharmony_ci be modified to change which mappings are searched. The list should 737db96d56Sopenharmony_ci always contain at least one mapping. 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci .. method:: new_child(m=None, **kwargs) 767db96d56Sopenharmony_ci 777db96d56Sopenharmony_ci Returns a new :class:`ChainMap` containing a new map followed by 787db96d56Sopenharmony_ci all of the maps in the current instance. If ``m`` is specified, 797db96d56Sopenharmony_ci it becomes the new map at the front of the list of mappings; if not 807db96d56Sopenharmony_ci specified, an empty dict is used, so that a call to ``d.new_child()`` 817db96d56Sopenharmony_ci is equivalent to: ``ChainMap({}, *d.maps)``. If any keyword arguments 827db96d56Sopenharmony_ci are specified, they update passed map or new empty dict. This method 837db96d56Sopenharmony_ci is used for creating subcontexts that can be updated without altering 847db96d56Sopenharmony_ci values in any of the parent mappings. 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci .. versionchanged:: 3.4 877db96d56Sopenharmony_ci The optional ``m`` parameter was added. 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ci .. versionchanged:: 3.10 907db96d56Sopenharmony_ci Keyword arguments support was added. 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_ci .. attribute:: parents 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci Property returning a new :class:`ChainMap` containing all of the maps in 957db96d56Sopenharmony_ci the current instance except the first one. This is useful for skipping 967db96d56Sopenharmony_ci the first map in the search. Use cases are similar to those for the 977db96d56Sopenharmony_ci :keyword:`nonlocal` keyword used in :term:`nested scopes <nested 987db96d56Sopenharmony_ci scope>`. The use cases also parallel those for the built-in 997db96d56Sopenharmony_ci :func:`super` function. A reference to ``d.parents`` is equivalent to: 1007db96d56Sopenharmony_ci ``ChainMap(*d.maps[1:])``. 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci Note, the iteration order of a :class:`ChainMap()` is determined by 1037db96d56Sopenharmony_ci scanning the mappings last to first:: 1047db96d56Sopenharmony_ci 1057db96d56Sopenharmony_ci >>> baseline = {'music': 'bach', 'art': 'rembrandt'} 1067db96d56Sopenharmony_ci >>> adjustments = {'art': 'van gogh', 'opera': 'carmen'} 1077db96d56Sopenharmony_ci >>> list(ChainMap(adjustments, baseline)) 1087db96d56Sopenharmony_ci ['music', 'art', 'opera'] 1097db96d56Sopenharmony_ci 1107db96d56Sopenharmony_ci This gives the same ordering as a series of :meth:`dict.update` calls 1117db96d56Sopenharmony_ci starting with the last mapping:: 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci >>> combined = baseline.copy() 1147db96d56Sopenharmony_ci >>> combined.update(adjustments) 1157db96d56Sopenharmony_ci >>> list(combined) 1167db96d56Sopenharmony_ci ['music', 'art', 'opera'] 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ci .. versionchanged:: 3.9 1197db96d56Sopenharmony_ci Added support for ``|`` and ``|=`` operators, specified in :pep:`584`. 1207db96d56Sopenharmony_ci 1217db96d56Sopenharmony_ci.. seealso:: 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ci * The `MultiContext class 1247db96d56Sopenharmony_ci <https://github.com/enthought/codetools/blob/4.0.0/codetools/contexts/multi_context.py>`_ 1257db96d56Sopenharmony_ci in the Enthought `CodeTools package 1267db96d56Sopenharmony_ci <https://github.com/enthought/codetools>`_ has options to support 1277db96d56Sopenharmony_ci writing to any mapping in the chain. 1287db96d56Sopenharmony_ci 1297db96d56Sopenharmony_ci * Django's `Context class 1307db96d56Sopenharmony_ci <https://github.com/django/django/blob/main/django/template/context.py>`_ 1317db96d56Sopenharmony_ci for templating is a read-only chain of mappings. It also features 1327db96d56Sopenharmony_ci pushing and popping of contexts similar to the 1337db96d56Sopenharmony_ci :meth:`~collections.ChainMap.new_child` method and the 1347db96d56Sopenharmony_ci :attr:`~collections.ChainMap.parents` property. 1357db96d56Sopenharmony_ci 1367db96d56Sopenharmony_ci * The `Nested Contexts recipe 1377db96d56Sopenharmony_ci <https://code.activestate.com/recipes/577434/>`_ has options to control 1387db96d56Sopenharmony_ci whether writes and other mutations apply only to the first mapping or to 1397db96d56Sopenharmony_ci any mapping in the chain. 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_ci * A `greatly simplified read-only version of Chainmap 1427db96d56Sopenharmony_ci <https://code.activestate.com/recipes/305268/>`_. 1437db96d56Sopenharmony_ci 1447db96d56Sopenharmony_ci 1457db96d56Sopenharmony_ci:class:`ChainMap` Examples and Recipes 1467db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1477db96d56Sopenharmony_ci 1487db96d56Sopenharmony_ciThis section shows various approaches to working with chained maps. 1497db96d56Sopenharmony_ci 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ciExample of simulating Python's internal lookup chain:: 1527db96d56Sopenharmony_ci 1537db96d56Sopenharmony_ci import builtins 1547db96d56Sopenharmony_ci pylookup = ChainMap(locals(), globals(), vars(builtins)) 1557db96d56Sopenharmony_ci 1567db96d56Sopenharmony_ciExample of letting user specified command-line arguments take precedence over 1577db96d56Sopenharmony_cienvironment variables which in turn take precedence over default values:: 1587db96d56Sopenharmony_ci 1597db96d56Sopenharmony_ci import os, argparse 1607db96d56Sopenharmony_ci 1617db96d56Sopenharmony_ci defaults = {'color': 'red', 'user': 'guest'} 1627db96d56Sopenharmony_ci 1637db96d56Sopenharmony_ci parser = argparse.ArgumentParser() 1647db96d56Sopenharmony_ci parser.add_argument('-u', '--user') 1657db96d56Sopenharmony_ci parser.add_argument('-c', '--color') 1667db96d56Sopenharmony_ci namespace = parser.parse_args() 1677db96d56Sopenharmony_ci command_line_args = {k: v for k, v in vars(namespace).items() if v is not None} 1687db96d56Sopenharmony_ci 1697db96d56Sopenharmony_ci combined = ChainMap(command_line_args, os.environ, defaults) 1707db96d56Sopenharmony_ci print(combined['color']) 1717db96d56Sopenharmony_ci print(combined['user']) 1727db96d56Sopenharmony_ci 1737db96d56Sopenharmony_ciExample patterns for using the :class:`ChainMap` class to simulate nested 1747db96d56Sopenharmony_cicontexts:: 1757db96d56Sopenharmony_ci 1767db96d56Sopenharmony_ci c = ChainMap() # Create root context 1777db96d56Sopenharmony_ci d = c.new_child() # Create nested child context 1787db96d56Sopenharmony_ci e = c.new_child() # Child of c, independent from d 1797db96d56Sopenharmony_ci e.maps[0] # Current context dictionary -- like Python's locals() 1807db96d56Sopenharmony_ci e.maps[-1] # Root context -- like Python's globals() 1817db96d56Sopenharmony_ci e.parents # Enclosing context chain -- like Python's nonlocals 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ci d['x'] = 1 # Set value in current context 1847db96d56Sopenharmony_ci d['x'] # Get first key in the chain of contexts 1857db96d56Sopenharmony_ci del d['x'] # Delete from current context 1867db96d56Sopenharmony_ci list(d) # All nested values 1877db96d56Sopenharmony_ci k in d # Check all nested values 1887db96d56Sopenharmony_ci len(d) # Number of nested values 1897db96d56Sopenharmony_ci d.items() # All nested items 1907db96d56Sopenharmony_ci dict(d) # Flatten into a regular dictionary 1917db96d56Sopenharmony_ci 1927db96d56Sopenharmony_ciThe :class:`ChainMap` class only makes updates (writes and deletions) to the 1937db96d56Sopenharmony_cifirst mapping in the chain while lookups will search the full chain. However, 1947db96d56Sopenharmony_ciif deep writes and deletions are desired, it is easy to make a subclass that 1957db96d56Sopenharmony_ciupdates keys found deeper in the chain:: 1967db96d56Sopenharmony_ci 1977db96d56Sopenharmony_ci class DeepChainMap(ChainMap): 1987db96d56Sopenharmony_ci 'Variant of ChainMap that allows direct updates to inner scopes' 1997db96d56Sopenharmony_ci 2007db96d56Sopenharmony_ci def __setitem__(self, key, value): 2017db96d56Sopenharmony_ci for mapping in self.maps: 2027db96d56Sopenharmony_ci if key in mapping: 2037db96d56Sopenharmony_ci mapping[key] = value 2047db96d56Sopenharmony_ci return 2057db96d56Sopenharmony_ci self.maps[0][key] = value 2067db96d56Sopenharmony_ci 2077db96d56Sopenharmony_ci def __delitem__(self, key): 2087db96d56Sopenharmony_ci for mapping in self.maps: 2097db96d56Sopenharmony_ci if key in mapping: 2107db96d56Sopenharmony_ci del mapping[key] 2117db96d56Sopenharmony_ci return 2127db96d56Sopenharmony_ci raise KeyError(key) 2137db96d56Sopenharmony_ci 2147db96d56Sopenharmony_ci >>> d = DeepChainMap({'zebra': 'black'}, {'elephant': 'blue'}, {'lion': 'yellow'}) 2157db96d56Sopenharmony_ci >>> d['lion'] = 'orange' # update an existing key two levels down 2167db96d56Sopenharmony_ci >>> d['snake'] = 'red' # new keys get added to the topmost dict 2177db96d56Sopenharmony_ci >>> del d['elephant'] # remove an existing key one level down 2187db96d56Sopenharmony_ci >>> d # display result 2197db96d56Sopenharmony_ci DeepChainMap({'zebra': 'black', 'snake': 'red'}, {}, {'lion': 'orange'}) 2207db96d56Sopenharmony_ci 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ci:class:`Counter` objects 2237db96d56Sopenharmony_ci------------------------ 2247db96d56Sopenharmony_ci 2257db96d56Sopenharmony_ciA counter tool is provided to support convenient and rapid tallies. 2267db96d56Sopenharmony_ciFor example:: 2277db96d56Sopenharmony_ci 2287db96d56Sopenharmony_ci >>> # Tally occurrences of words in a list 2297db96d56Sopenharmony_ci >>> cnt = Counter() 2307db96d56Sopenharmony_ci >>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']: 2317db96d56Sopenharmony_ci ... cnt[word] += 1 2327db96d56Sopenharmony_ci >>> cnt 2337db96d56Sopenharmony_ci Counter({'blue': 3, 'red': 2, 'green': 1}) 2347db96d56Sopenharmony_ci 2357db96d56Sopenharmony_ci >>> # Find the ten most common words in Hamlet 2367db96d56Sopenharmony_ci >>> import re 2377db96d56Sopenharmony_ci >>> words = re.findall(r'\w+', open('hamlet.txt').read().lower()) 2387db96d56Sopenharmony_ci >>> Counter(words).most_common(10) 2397db96d56Sopenharmony_ci [('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631), 2407db96d56Sopenharmony_ci ('you', 554), ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)] 2417db96d56Sopenharmony_ci 2427db96d56Sopenharmony_ci.. class:: Counter([iterable-or-mapping]) 2437db96d56Sopenharmony_ci 2447db96d56Sopenharmony_ci A :class:`Counter` is a :class:`dict` subclass for counting :term:`hashable` objects. 2457db96d56Sopenharmony_ci It is a collection where elements are stored as dictionary keys 2467db96d56Sopenharmony_ci and their counts are stored as dictionary values. Counts are allowed to be 2477db96d56Sopenharmony_ci any integer value including zero or negative counts. The :class:`Counter` 2487db96d56Sopenharmony_ci class is similar to bags or multisets in other languages. 2497db96d56Sopenharmony_ci 2507db96d56Sopenharmony_ci Elements are counted from an *iterable* or initialized from another 2517db96d56Sopenharmony_ci *mapping* (or counter): 2527db96d56Sopenharmony_ci 2537db96d56Sopenharmony_ci >>> c = Counter() # a new, empty counter 2547db96d56Sopenharmony_ci >>> c = Counter('gallahad') # a new counter from an iterable 2557db96d56Sopenharmony_ci >>> c = Counter({'red': 4, 'blue': 2}) # a new counter from a mapping 2567db96d56Sopenharmony_ci >>> c = Counter(cats=4, dogs=8) # a new counter from keyword args 2577db96d56Sopenharmony_ci 2587db96d56Sopenharmony_ci Counter objects have a dictionary interface except that they return a zero 2597db96d56Sopenharmony_ci count for missing items instead of raising a :exc:`KeyError`: 2607db96d56Sopenharmony_ci 2617db96d56Sopenharmony_ci >>> c = Counter(['eggs', 'ham']) 2627db96d56Sopenharmony_ci >>> c['bacon'] # count of a missing element is zero 2637db96d56Sopenharmony_ci 0 2647db96d56Sopenharmony_ci 2657db96d56Sopenharmony_ci Setting a count to zero does not remove an element from a counter. 2667db96d56Sopenharmony_ci Use ``del`` to remove it entirely: 2677db96d56Sopenharmony_ci 2687db96d56Sopenharmony_ci >>> c['sausage'] = 0 # counter entry with a zero count 2697db96d56Sopenharmony_ci >>> del c['sausage'] # del actually removes the entry 2707db96d56Sopenharmony_ci 2717db96d56Sopenharmony_ci .. versionadded:: 3.1 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci .. versionchanged:: 3.7 As a :class:`dict` subclass, :class:`Counter` 2747db96d56Sopenharmony_ci inherited the capability to remember insertion order. Math operations 2757db96d56Sopenharmony_ci on *Counter* objects also preserve order. Results are ordered 2767db96d56Sopenharmony_ci according to when an element is first encountered in the left operand 2777db96d56Sopenharmony_ci and then by the order encountered in the right operand. 2787db96d56Sopenharmony_ci 2797db96d56Sopenharmony_ci Counter objects support additional methods beyond those available for all 2807db96d56Sopenharmony_ci dictionaries: 2817db96d56Sopenharmony_ci 2827db96d56Sopenharmony_ci .. method:: elements() 2837db96d56Sopenharmony_ci 2847db96d56Sopenharmony_ci Return an iterator over elements repeating each as many times as its 2857db96d56Sopenharmony_ci count. Elements are returned in the order first encountered. If an 2867db96d56Sopenharmony_ci element's count is less than one, :meth:`elements` will ignore it. 2877db96d56Sopenharmony_ci 2887db96d56Sopenharmony_ci >>> c = Counter(a=4, b=2, c=0, d=-2) 2897db96d56Sopenharmony_ci >>> sorted(c.elements()) 2907db96d56Sopenharmony_ci ['a', 'a', 'a', 'a', 'b', 'b'] 2917db96d56Sopenharmony_ci 2927db96d56Sopenharmony_ci .. method:: most_common([n]) 2937db96d56Sopenharmony_ci 2947db96d56Sopenharmony_ci Return a list of the *n* most common elements and their counts from the 2957db96d56Sopenharmony_ci most common to the least. If *n* is omitted or ``None``, 2967db96d56Sopenharmony_ci :meth:`most_common` returns *all* elements in the counter. 2977db96d56Sopenharmony_ci Elements with equal counts are ordered in the order first encountered: 2987db96d56Sopenharmony_ci 2997db96d56Sopenharmony_ci >>> Counter('abracadabra').most_common(3) 3007db96d56Sopenharmony_ci [('a', 5), ('b', 2), ('r', 2)] 3017db96d56Sopenharmony_ci 3027db96d56Sopenharmony_ci .. method:: subtract([iterable-or-mapping]) 3037db96d56Sopenharmony_ci 3047db96d56Sopenharmony_ci Elements are subtracted from an *iterable* or from another *mapping* 3057db96d56Sopenharmony_ci (or counter). Like :meth:`dict.update` but subtracts counts instead 3067db96d56Sopenharmony_ci of replacing them. Both inputs and outputs may be zero or negative. 3077db96d56Sopenharmony_ci 3087db96d56Sopenharmony_ci >>> c = Counter(a=4, b=2, c=0, d=-2) 3097db96d56Sopenharmony_ci >>> d = Counter(a=1, b=2, c=3, d=4) 3107db96d56Sopenharmony_ci >>> c.subtract(d) 3117db96d56Sopenharmony_ci >>> c 3127db96d56Sopenharmony_ci Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6}) 3137db96d56Sopenharmony_ci 3147db96d56Sopenharmony_ci .. versionadded:: 3.2 3157db96d56Sopenharmony_ci 3167db96d56Sopenharmony_ci .. method:: total() 3177db96d56Sopenharmony_ci 3187db96d56Sopenharmony_ci Compute the sum of the counts. 3197db96d56Sopenharmony_ci 3207db96d56Sopenharmony_ci >>> c = Counter(a=10, b=5, c=0) 3217db96d56Sopenharmony_ci >>> c.total() 3227db96d56Sopenharmony_ci 15 3237db96d56Sopenharmony_ci 3247db96d56Sopenharmony_ci .. versionadded:: 3.10 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ci The usual dictionary methods are available for :class:`Counter` objects 3277db96d56Sopenharmony_ci except for two which work differently for counters. 3287db96d56Sopenharmony_ci 3297db96d56Sopenharmony_ci .. method:: fromkeys(iterable) 3307db96d56Sopenharmony_ci 3317db96d56Sopenharmony_ci This class method is not implemented for :class:`Counter` objects. 3327db96d56Sopenharmony_ci 3337db96d56Sopenharmony_ci .. method:: update([iterable-or-mapping]) 3347db96d56Sopenharmony_ci 3357db96d56Sopenharmony_ci Elements are counted from an *iterable* or added-in from another 3367db96d56Sopenharmony_ci *mapping* (or counter). Like :meth:`dict.update` but adds counts 3377db96d56Sopenharmony_ci instead of replacing them. Also, the *iterable* is expected to be a 3387db96d56Sopenharmony_ci sequence of elements, not a sequence of ``(key, value)`` pairs. 3397db96d56Sopenharmony_ci 3407db96d56Sopenharmony_ciCounters support rich comparison operators for equality, subset, and 3417db96d56Sopenharmony_cisuperset relationships: ``==``, ``!=``, ``<``, ``<=``, ``>``, ``>=``. 3427db96d56Sopenharmony_ciAll of those tests treat missing elements as having zero counts so that 3437db96d56Sopenharmony_ci``Counter(a=1) == Counter(a=1, b=0)`` returns true. 3447db96d56Sopenharmony_ci 3457db96d56Sopenharmony_ci.. versionadded:: 3.10 3467db96d56Sopenharmony_ci Rich comparison operations were added. 3477db96d56Sopenharmony_ci 3487db96d56Sopenharmony_ci.. versionchanged:: 3.10 3497db96d56Sopenharmony_ci In equality tests, missing elements are treated as having zero counts. 3507db96d56Sopenharmony_ci Formerly, ``Counter(a=3)`` and ``Counter(a=3, b=0)`` were considered 3517db96d56Sopenharmony_ci distinct. 3527db96d56Sopenharmony_ci 3537db96d56Sopenharmony_ciCommon patterns for working with :class:`Counter` objects:: 3547db96d56Sopenharmony_ci 3557db96d56Sopenharmony_ci c.total() # total of all counts 3567db96d56Sopenharmony_ci c.clear() # reset all counts 3577db96d56Sopenharmony_ci list(c) # list unique elements 3587db96d56Sopenharmony_ci set(c) # convert to a set 3597db96d56Sopenharmony_ci dict(c) # convert to a regular dictionary 3607db96d56Sopenharmony_ci c.items() # convert to a list of (elem, cnt) pairs 3617db96d56Sopenharmony_ci Counter(dict(list_of_pairs)) # convert from a list of (elem, cnt) pairs 3627db96d56Sopenharmony_ci c.most_common()[:-n-1:-1] # n least common elements 3637db96d56Sopenharmony_ci +c # remove zero and negative counts 3647db96d56Sopenharmony_ci 3657db96d56Sopenharmony_ciSeveral mathematical operations are provided for combining :class:`Counter` 3667db96d56Sopenharmony_ciobjects to produce multisets (counters that have counts greater than zero). 3677db96d56Sopenharmony_ciAddition and subtraction combine counters by adding or subtracting the counts 3687db96d56Sopenharmony_ciof corresponding elements. Intersection and union return the minimum and 3697db96d56Sopenharmony_cimaximum of corresponding counts. Equality and inclusion compare 3707db96d56Sopenharmony_cicorresponding counts. Each operation can accept inputs with signed 3717db96d56Sopenharmony_cicounts, but the output will exclude results with counts of zero or less. 3727db96d56Sopenharmony_ci 3737db96d56Sopenharmony_ci.. doctest:: 3747db96d56Sopenharmony_ci 3757db96d56Sopenharmony_ci >>> c = Counter(a=3, b=1) 3767db96d56Sopenharmony_ci >>> d = Counter(a=1, b=2) 3777db96d56Sopenharmony_ci >>> c + d # add two counters together: c[x] + d[x] 3787db96d56Sopenharmony_ci Counter({'a': 4, 'b': 3}) 3797db96d56Sopenharmony_ci >>> c - d # subtract (keeping only positive counts) 3807db96d56Sopenharmony_ci Counter({'a': 2}) 3817db96d56Sopenharmony_ci >>> c & d # intersection: min(c[x], d[x]) 3827db96d56Sopenharmony_ci Counter({'a': 1, 'b': 1}) 3837db96d56Sopenharmony_ci >>> c | d # union: max(c[x], d[x]) 3847db96d56Sopenharmony_ci Counter({'a': 3, 'b': 2}) 3857db96d56Sopenharmony_ci >>> c == d # equality: c[x] == d[x] 3867db96d56Sopenharmony_ci False 3877db96d56Sopenharmony_ci >>> c <= d # inclusion: c[x] <= d[x] 3887db96d56Sopenharmony_ci False 3897db96d56Sopenharmony_ci 3907db96d56Sopenharmony_ciUnary addition and subtraction are shortcuts for adding an empty counter 3917db96d56Sopenharmony_cior subtracting from an empty counter. 3927db96d56Sopenharmony_ci 3937db96d56Sopenharmony_ci >>> c = Counter(a=2, b=-4) 3947db96d56Sopenharmony_ci >>> +c 3957db96d56Sopenharmony_ci Counter({'a': 2}) 3967db96d56Sopenharmony_ci >>> -c 3977db96d56Sopenharmony_ci Counter({'b': 4}) 3987db96d56Sopenharmony_ci 3997db96d56Sopenharmony_ci.. versionadded:: 3.3 4007db96d56Sopenharmony_ci Added support for unary plus, unary minus, and in-place multiset operations. 4017db96d56Sopenharmony_ci 4027db96d56Sopenharmony_ci.. note:: 4037db96d56Sopenharmony_ci 4047db96d56Sopenharmony_ci Counters were primarily designed to work with positive integers to represent 4057db96d56Sopenharmony_ci running counts; however, care was taken to not unnecessarily preclude use 4067db96d56Sopenharmony_ci cases needing other types or negative values. To help with those use cases, 4077db96d56Sopenharmony_ci this section documents the minimum range and type restrictions. 4087db96d56Sopenharmony_ci 4097db96d56Sopenharmony_ci * The :class:`Counter` class itself is a dictionary subclass with no 4107db96d56Sopenharmony_ci restrictions on its keys and values. The values are intended to be numbers 4117db96d56Sopenharmony_ci representing counts, but you *could* store anything in the value field. 4127db96d56Sopenharmony_ci 4137db96d56Sopenharmony_ci * The :meth:`~Counter.most_common` method requires only that the values be orderable. 4147db96d56Sopenharmony_ci 4157db96d56Sopenharmony_ci * For in-place operations such as ``c[key] += 1``, the value type need only 4167db96d56Sopenharmony_ci support addition and subtraction. So fractions, floats, and decimals would 4177db96d56Sopenharmony_ci work and negative values are supported. The same is also true for 4187db96d56Sopenharmony_ci :meth:`~Counter.update` and :meth:`~Counter.subtract` which allow negative and zero values 4197db96d56Sopenharmony_ci for both inputs and outputs. 4207db96d56Sopenharmony_ci 4217db96d56Sopenharmony_ci * The multiset methods are designed only for use cases with positive values. 4227db96d56Sopenharmony_ci The inputs may be negative or zero, but only outputs with positive values 4237db96d56Sopenharmony_ci are created. There are no type restrictions, but the value type needs to 4247db96d56Sopenharmony_ci support addition, subtraction, and comparison. 4257db96d56Sopenharmony_ci 4267db96d56Sopenharmony_ci * The :meth:`~Counter.elements` method requires integer counts. It ignores zero and 4277db96d56Sopenharmony_ci negative counts. 4287db96d56Sopenharmony_ci 4297db96d56Sopenharmony_ci.. seealso:: 4307db96d56Sopenharmony_ci 4317db96d56Sopenharmony_ci * `Bag class <https://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html>`_ 4327db96d56Sopenharmony_ci in Smalltalk. 4337db96d56Sopenharmony_ci 4347db96d56Sopenharmony_ci * Wikipedia entry for `Multisets <https://en.wikipedia.org/wiki/Multiset>`_. 4357db96d56Sopenharmony_ci 4367db96d56Sopenharmony_ci * `C++ multisets <http://www.java2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm>`_ 4377db96d56Sopenharmony_ci tutorial with examples. 4387db96d56Sopenharmony_ci 4397db96d56Sopenharmony_ci * For mathematical operations on multisets and their use cases, see 4407db96d56Sopenharmony_ci *Knuth, Donald. The Art of Computer Programming Volume II, 4417db96d56Sopenharmony_ci Section 4.6.3, Exercise 19*. 4427db96d56Sopenharmony_ci 4437db96d56Sopenharmony_ci * To enumerate all distinct multisets of a given size over a given set of 4447db96d56Sopenharmony_ci elements, see :func:`itertools.combinations_with_replacement`:: 4457db96d56Sopenharmony_ci 4467db96d56Sopenharmony_ci map(Counter, combinations_with_replacement('ABC', 2)) # --> AA AB AC BB BC CC 4477db96d56Sopenharmony_ci 4487db96d56Sopenharmony_ci 4497db96d56Sopenharmony_ci:class:`deque` objects 4507db96d56Sopenharmony_ci---------------------- 4517db96d56Sopenharmony_ci 4527db96d56Sopenharmony_ci.. class:: deque([iterable, [maxlen]]) 4537db96d56Sopenharmony_ci 4547db96d56Sopenharmony_ci Returns a new deque object initialized left-to-right (using :meth:`append`) with 4557db96d56Sopenharmony_ci data from *iterable*. If *iterable* is not specified, the new deque is empty. 4567db96d56Sopenharmony_ci 4577db96d56Sopenharmony_ci Deques are a generalization of stacks and queues (the name is pronounced "deck" 4587db96d56Sopenharmony_ci and is short for "double-ended queue"). Deques support thread-safe, memory 4597db96d56Sopenharmony_ci efficient appends and pops from either side of the deque with approximately the 4607db96d56Sopenharmony_ci same O(1) performance in either direction. 4617db96d56Sopenharmony_ci 4627db96d56Sopenharmony_ci Though :class:`list` objects support similar operations, they are optimized for 4637db96d56Sopenharmony_ci fast fixed-length operations and incur O(n) memory movement costs for 4647db96d56Sopenharmony_ci ``pop(0)`` and ``insert(0, v)`` operations which change both the size and 4657db96d56Sopenharmony_ci position of the underlying data representation. 4667db96d56Sopenharmony_ci 4677db96d56Sopenharmony_ci 4687db96d56Sopenharmony_ci If *maxlen* is not specified or is ``None``, deques may grow to an 4697db96d56Sopenharmony_ci arbitrary length. Otherwise, the deque is bounded to the specified maximum 4707db96d56Sopenharmony_ci length. Once a bounded length deque is full, when new items are added, a 4717db96d56Sopenharmony_ci corresponding number of items are discarded from the opposite end. Bounded 4727db96d56Sopenharmony_ci length deques provide functionality similar to the ``tail`` filter in 4737db96d56Sopenharmony_ci Unix. They are also useful for tracking transactions and other pools of data 4747db96d56Sopenharmony_ci where only the most recent activity is of interest. 4757db96d56Sopenharmony_ci 4767db96d56Sopenharmony_ci 4777db96d56Sopenharmony_ci Deque objects support the following methods: 4787db96d56Sopenharmony_ci 4797db96d56Sopenharmony_ci .. method:: append(x) 4807db96d56Sopenharmony_ci 4817db96d56Sopenharmony_ci Add *x* to the right side of the deque. 4827db96d56Sopenharmony_ci 4837db96d56Sopenharmony_ci 4847db96d56Sopenharmony_ci .. method:: appendleft(x) 4857db96d56Sopenharmony_ci 4867db96d56Sopenharmony_ci Add *x* to the left side of the deque. 4877db96d56Sopenharmony_ci 4887db96d56Sopenharmony_ci 4897db96d56Sopenharmony_ci .. method:: clear() 4907db96d56Sopenharmony_ci 4917db96d56Sopenharmony_ci Remove all elements from the deque leaving it with length 0. 4927db96d56Sopenharmony_ci 4937db96d56Sopenharmony_ci 4947db96d56Sopenharmony_ci .. method:: copy() 4957db96d56Sopenharmony_ci 4967db96d56Sopenharmony_ci Create a shallow copy of the deque. 4977db96d56Sopenharmony_ci 4987db96d56Sopenharmony_ci .. versionadded:: 3.5 4997db96d56Sopenharmony_ci 5007db96d56Sopenharmony_ci 5017db96d56Sopenharmony_ci .. method:: count(x) 5027db96d56Sopenharmony_ci 5037db96d56Sopenharmony_ci Count the number of deque elements equal to *x*. 5047db96d56Sopenharmony_ci 5057db96d56Sopenharmony_ci .. versionadded:: 3.2 5067db96d56Sopenharmony_ci 5077db96d56Sopenharmony_ci 5087db96d56Sopenharmony_ci .. method:: extend(iterable) 5097db96d56Sopenharmony_ci 5107db96d56Sopenharmony_ci Extend the right side of the deque by appending elements from the iterable 5117db96d56Sopenharmony_ci argument. 5127db96d56Sopenharmony_ci 5137db96d56Sopenharmony_ci 5147db96d56Sopenharmony_ci .. method:: extendleft(iterable) 5157db96d56Sopenharmony_ci 5167db96d56Sopenharmony_ci Extend the left side of the deque by appending elements from *iterable*. 5177db96d56Sopenharmony_ci Note, the series of left appends results in reversing the order of 5187db96d56Sopenharmony_ci elements in the iterable argument. 5197db96d56Sopenharmony_ci 5207db96d56Sopenharmony_ci 5217db96d56Sopenharmony_ci .. method:: index(x[, start[, stop]]) 5227db96d56Sopenharmony_ci 5237db96d56Sopenharmony_ci Return the position of *x* in the deque (at or after index *start* 5247db96d56Sopenharmony_ci and before index *stop*). Returns the first match or raises 5257db96d56Sopenharmony_ci :exc:`ValueError` if not found. 5267db96d56Sopenharmony_ci 5277db96d56Sopenharmony_ci .. versionadded:: 3.5 5287db96d56Sopenharmony_ci 5297db96d56Sopenharmony_ci 5307db96d56Sopenharmony_ci .. method:: insert(i, x) 5317db96d56Sopenharmony_ci 5327db96d56Sopenharmony_ci Insert *x* into the deque at position *i*. 5337db96d56Sopenharmony_ci 5347db96d56Sopenharmony_ci If the insertion would cause a bounded deque to grow beyond *maxlen*, 5357db96d56Sopenharmony_ci an :exc:`IndexError` is raised. 5367db96d56Sopenharmony_ci 5377db96d56Sopenharmony_ci .. versionadded:: 3.5 5387db96d56Sopenharmony_ci 5397db96d56Sopenharmony_ci 5407db96d56Sopenharmony_ci .. method:: pop() 5417db96d56Sopenharmony_ci 5427db96d56Sopenharmony_ci Remove and return an element from the right side of the deque. If no 5437db96d56Sopenharmony_ci elements are present, raises an :exc:`IndexError`. 5447db96d56Sopenharmony_ci 5457db96d56Sopenharmony_ci 5467db96d56Sopenharmony_ci .. method:: popleft() 5477db96d56Sopenharmony_ci 5487db96d56Sopenharmony_ci Remove and return an element from the left side of the deque. If no 5497db96d56Sopenharmony_ci elements are present, raises an :exc:`IndexError`. 5507db96d56Sopenharmony_ci 5517db96d56Sopenharmony_ci 5527db96d56Sopenharmony_ci .. method:: remove(value) 5537db96d56Sopenharmony_ci 5547db96d56Sopenharmony_ci Remove the first occurrence of *value*. If not found, raises a 5557db96d56Sopenharmony_ci :exc:`ValueError`. 5567db96d56Sopenharmony_ci 5577db96d56Sopenharmony_ci 5587db96d56Sopenharmony_ci .. method:: reverse() 5597db96d56Sopenharmony_ci 5607db96d56Sopenharmony_ci Reverse the elements of the deque in-place and then return ``None``. 5617db96d56Sopenharmony_ci 5627db96d56Sopenharmony_ci .. versionadded:: 3.2 5637db96d56Sopenharmony_ci 5647db96d56Sopenharmony_ci 5657db96d56Sopenharmony_ci .. method:: rotate(n=1) 5667db96d56Sopenharmony_ci 5677db96d56Sopenharmony_ci Rotate the deque *n* steps to the right. If *n* is negative, rotate 5687db96d56Sopenharmony_ci to the left. 5697db96d56Sopenharmony_ci 5707db96d56Sopenharmony_ci When the deque is not empty, rotating one step to the right is equivalent 5717db96d56Sopenharmony_ci to ``d.appendleft(d.pop())``, and rotating one step to the left is 5727db96d56Sopenharmony_ci equivalent to ``d.append(d.popleft())``. 5737db96d56Sopenharmony_ci 5747db96d56Sopenharmony_ci 5757db96d56Sopenharmony_ci Deque objects also provide one read-only attribute: 5767db96d56Sopenharmony_ci 5777db96d56Sopenharmony_ci .. attribute:: maxlen 5787db96d56Sopenharmony_ci 5797db96d56Sopenharmony_ci Maximum size of a deque or ``None`` if unbounded. 5807db96d56Sopenharmony_ci 5817db96d56Sopenharmony_ci .. versionadded:: 3.1 5827db96d56Sopenharmony_ci 5837db96d56Sopenharmony_ci 5847db96d56Sopenharmony_ciIn addition to the above, deques support iteration, pickling, ``len(d)``, 5857db96d56Sopenharmony_ci``reversed(d)``, ``copy.copy(d)``, ``copy.deepcopy(d)``, membership testing with 5867db96d56Sopenharmony_cithe :keyword:`in` operator, and subscript references such as ``d[0]`` to access 5877db96d56Sopenharmony_cithe first element. Indexed access is O(1) at both ends but slows to O(n) in 5887db96d56Sopenharmony_cithe middle. For fast random access, use lists instead. 5897db96d56Sopenharmony_ci 5907db96d56Sopenharmony_ciStarting in version 3.5, deques support ``__add__()``, ``__mul__()``, 5917db96d56Sopenharmony_ciand ``__imul__()``. 5927db96d56Sopenharmony_ci 5937db96d56Sopenharmony_ciExample: 5947db96d56Sopenharmony_ci 5957db96d56Sopenharmony_ci.. doctest:: 5967db96d56Sopenharmony_ci 5977db96d56Sopenharmony_ci >>> from collections import deque 5987db96d56Sopenharmony_ci >>> d = deque('ghi') # make a new deque with three items 5997db96d56Sopenharmony_ci >>> for elem in d: # iterate over the deque's elements 6007db96d56Sopenharmony_ci ... print(elem.upper()) 6017db96d56Sopenharmony_ci G 6027db96d56Sopenharmony_ci H 6037db96d56Sopenharmony_ci I 6047db96d56Sopenharmony_ci 6057db96d56Sopenharmony_ci >>> d.append('j') # add a new entry to the right side 6067db96d56Sopenharmony_ci >>> d.appendleft('f') # add a new entry to the left side 6077db96d56Sopenharmony_ci >>> d # show the representation of the deque 6087db96d56Sopenharmony_ci deque(['f', 'g', 'h', 'i', 'j']) 6097db96d56Sopenharmony_ci 6107db96d56Sopenharmony_ci >>> d.pop() # return and remove the rightmost item 6117db96d56Sopenharmony_ci 'j' 6127db96d56Sopenharmony_ci >>> d.popleft() # return and remove the leftmost item 6137db96d56Sopenharmony_ci 'f' 6147db96d56Sopenharmony_ci >>> list(d) # list the contents of the deque 6157db96d56Sopenharmony_ci ['g', 'h', 'i'] 6167db96d56Sopenharmony_ci >>> d[0] # peek at leftmost item 6177db96d56Sopenharmony_ci 'g' 6187db96d56Sopenharmony_ci >>> d[-1] # peek at rightmost item 6197db96d56Sopenharmony_ci 'i' 6207db96d56Sopenharmony_ci 6217db96d56Sopenharmony_ci >>> list(reversed(d)) # list the contents of a deque in reverse 6227db96d56Sopenharmony_ci ['i', 'h', 'g'] 6237db96d56Sopenharmony_ci >>> 'h' in d # search the deque 6247db96d56Sopenharmony_ci True 6257db96d56Sopenharmony_ci >>> d.extend('jkl') # add multiple elements at once 6267db96d56Sopenharmony_ci >>> d 6277db96d56Sopenharmony_ci deque(['g', 'h', 'i', 'j', 'k', 'l']) 6287db96d56Sopenharmony_ci >>> d.rotate(1) # right rotation 6297db96d56Sopenharmony_ci >>> d 6307db96d56Sopenharmony_ci deque(['l', 'g', 'h', 'i', 'j', 'k']) 6317db96d56Sopenharmony_ci >>> d.rotate(-1) # left rotation 6327db96d56Sopenharmony_ci >>> d 6337db96d56Sopenharmony_ci deque(['g', 'h', 'i', 'j', 'k', 'l']) 6347db96d56Sopenharmony_ci 6357db96d56Sopenharmony_ci >>> deque(reversed(d)) # make a new deque in reverse order 6367db96d56Sopenharmony_ci deque(['l', 'k', 'j', 'i', 'h', 'g']) 6377db96d56Sopenharmony_ci >>> d.clear() # empty the deque 6387db96d56Sopenharmony_ci >>> d.pop() # cannot pop from an empty deque 6397db96d56Sopenharmony_ci Traceback (most recent call last): 6407db96d56Sopenharmony_ci File "<pyshell#6>", line 1, in -toplevel- 6417db96d56Sopenharmony_ci d.pop() 6427db96d56Sopenharmony_ci IndexError: pop from an empty deque 6437db96d56Sopenharmony_ci 6447db96d56Sopenharmony_ci >>> d.extendleft('abc') # extendleft() reverses the input order 6457db96d56Sopenharmony_ci >>> d 6467db96d56Sopenharmony_ci deque(['c', 'b', 'a']) 6477db96d56Sopenharmony_ci 6487db96d56Sopenharmony_ci 6497db96d56Sopenharmony_ci:class:`deque` Recipes 6507db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^ 6517db96d56Sopenharmony_ci 6527db96d56Sopenharmony_ciThis section shows various approaches to working with deques. 6537db96d56Sopenharmony_ci 6547db96d56Sopenharmony_ciBounded length deques provide functionality similar to the ``tail`` filter 6557db96d56Sopenharmony_ciin Unix:: 6567db96d56Sopenharmony_ci 6577db96d56Sopenharmony_ci def tail(filename, n=10): 6587db96d56Sopenharmony_ci 'Return the last n lines of a file' 6597db96d56Sopenharmony_ci with open(filename) as f: 6607db96d56Sopenharmony_ci return deque(f, n) 6617db96d56Sopenharmony_ci 6627db96d56Sopenharmony_ciAnother approach to using deques is to maintain a sequence of recently 6637db96d56Sopenharmony_ciadded elements by appending to the right and popping to the left:: 6647db96d56Sopenharmony_ci 6657db96d56Sopenharmony_ci def moving_average(iterable, n=3): 6667db96d56Sopenharmony_ci # moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0 6677db96d56Sopenharmony_ci # https://en.wikipedia.org/wiki/Moving_average 6687db96d56Sopenharmony_ci it = iter(iterable) 6697db96d56Sopenharmony_ci d = deque(itertools.islice(it, n-1)) 6707db96d56Sopenharmony_ci d.appendleft(0) 6717db96d56Sopenharmony_ci s = sum(d) 6727db96d56Sopenharmony_ci for elem in it: 6737db96d56Sopenharmony_ci s += elem - d.popleft() 6747db96d56Sopenharmony_ci d.append(elem) 6757db96d56Sopenharmony_ci yield s / n 6767db96d56Sopenharmony_ci 6777db96d56Sopenharmony_ciA `round-robin scheduler 6787db96d56Sopenharmony_ci<https://en.wikipedia.org/wiki/Round-robin_scheduling>`_ can be implemented with 6797db96d56Sopenharmony_ciinput iterators stored in a :class:`deque`. Values are yielded from the active 6807db96d56Sopenharmony_ciiterator in position zero. If that iterator is exhausted, it can be removed 6817db96d56Sopenharmony_ciwith :meth:`~deque.popleft`; otherwise, it can be cycled back to the end with 6827db96d56Sopenharmony_cithe :meth:`~deque.rotate` method:: 6837db96d56Sopenharmony_ci 6847db96d56Sopenharmony_ci def roundrobin(*iterables): 6857db96d56Sopenharmony_ci "roundrobin('ABC', 'D', 'EF') --> A D E B F C" 6867db96d56Sopenharmony_ci iterators = deque(map(iter, iterables)) 6877db96d56Sopenharmony_ci while iterators: 6887db96d56Sopenharmony_ci try: 6897db96d56Sopenharmony_ci while True: 6907db96d56Sopenharmony_ci yield next(iterators[0]) 6917db96d56Sopenharmony_ci iterators.rotate(-1) 6927db96d56Sopenharmony_ci except StopIteration: 6937db96d56Sopenharmony_ci # Remove an exhausted iterator. 6947db96d56Sopenharmony_ci iterators.popleft() 6957db96d56Sopenharmony_ci 6967db96d56Sopenharmony_ciThe :meth:`~deque.rotate` method provides a way to implement :class:`deque` slicing and 6977db96d56Sopenharmony_cideletion. For example, a pure Python implementation of ``del d[n]`` relies on 6987db96d56Sopenharmony_cithe ``rotate()`` method to position elements to be popped:: 6997db96d56Sopenharmony_ci 7007db96d56Sopenharmony_ci def delete_nth(d, n): 7017db96d56Sopenharmony_ci d.rotate(-n) 7027db96d56Sopenharmony_ci d.popleft() 7037db96d56Sopenharmony_ci d.rotate(n) 7047db96d56Sopenharmony_ci 7057db96d56Sopenharmony_ciTo implement :class:`deque` slicing, use a similar approach applying 7067db96d56Sopenharmony_ci:meth:`~deque.rotate` to bring a target element to the left side of the deque. Remove 7077db96d56Sopenharmony_ciold entries with :meth:`~deque.popleft`, add new entries with :meth:`~deque.extend`, and then 7087db96d56Sopenharmony_cireverse the rotation. 7097db96d56Sopenharmony_ciWith minor variations on that approach, it is easy to implement Forth style 7107db96d56Sopenharmony_cistack manipulations such as ``dup``, ``drop``, ``swap``, ``over``, ``pick``, 7117db96d56Sopenharmony_ci``rot``, and ``roll``. 7127db96d56Sopenharmony_ci 7137db96d56Sopenharmony_ci 7147db96d56Sopenharmony_ci:class:`defaultdict` objects 7157db96d56Sopenharmony_ci---------------------------- 7167db96d56Sopenharmony_ci 7177db96d56Sopenharmony_ci.. class:: defaultdict(default_factory=None, /, [...]) 7187db96d56Sopenharmony_ci 7197db96d56Sopenharmony_ci Return a new dictionary-like object. :class:`defaultdict` is a subclass of the 7207db96d56Sopenharmony_ci built-in :class:`dict` class. It overrides one method and adds one writable 7217db96d56Sopenharmony_ci instance variable. The remaining functionality is the same as for the 7227db96d56Sopenharmony_ci :class:`dict` class and is not documented here. 7237db96d56Sopenharmony_ci 7247db96d56Sopenharmony_ci The first argument provides the initial value for the :attr:`default_factory` 7257db96d56Sopenharmony_ci attribute; it defaults to ``None``. All remaining arguments are treated the same 7267db96d56Sopenharmony_ci as if they were passed to the :class:`dict` constructor, including keyword 7277db96d56Sopenharmony_ci arguments. 7287db96d56Sopenharmony_ci 7297db96d56Sopenharmony_ci 7307db96d56Sopenharmony_ci :class:`defaultdict` objects support the following method in addition to the 7317db96d56Sopenharmony_ci standard :class:`dict` operations: 7327db96d56Sopenharmony_ci 7337db96d56Sopenharmony_ci .. method:: __missing__(key) 7347db96d56Sopenharmony_ci 7357db96d56Sopenharmony_ci If the :attr:`default_factory` attribute is ``None``, this raises a 7367db96d56Sopenharmony_ci :exc:`KeyError` exception with the *key* as argument. 7377db96d56Sopenharmony_ci 7387db96d56Sopenharmony_ci If :attr:`default_factory` is not ``None``, it is called without arguments 7397db96d56Sopenharmony_ci to provide a default value for the given *key*, this value is inserted in 7407db96d56Sopenharmony_ci the dictionary for the *key*, and returned. 7417db96d56Sopenharmony_ci 7427db96d56Sopenharmony_ci If calling :attr:`default_factory` raises an exception this exception is 7437db96d56Sopenharmony_ci propagated unchanged. 7447db96d56Sopenharmony_ci 7457db96d56Sopenharmony_ci This method is called by the :meth:`__getitem__` method of the 7467db96d56Sopenharmony_ci :class:`dict` class when the requested key is not found; whatever it 7477db96d56Sopenharmony_ci returns or raises is then returned or raised by :meth:`__getitem__`. 7487db96d56Sopenharmony_ci 7497db96d56Sopenharmony_ci Note that :meth:`__missing__` is *not* called for any operations besides 7507db96d56Sopenharmony_ci :meth:`__getitem__`. This means that :meth:`get` will, like normal 7517db96d56Sopenharmony_ci dictionaries, return ``None`` as a default rather than using 7527db96d56Sopenharmony_ci :attr:`default_factory`. 7537db96d56Sopenharmony_ci 7547db96d56Sopenharmony_ci 7557db96d56Sopenharmony_ci :class:`defaultdict` objects support the following instance variable: 7567db96d56Sopenharmony_ci 7577db96d56Sopenharmony_ci 7587db96d56Sopenharmony_ci .. attribute:: default_factory 7597db96d56Sopenharmony_ci 7607db96d56Sopenharmony_ci This attribute is used by the :meth:`__missing__` method; it is 7617db96d56Sopenharmony_ci initialized from the first argument to the constructor, if present, or to 7627db96d56Sopenharmony_ci ``None``, if absent. 7637db96d56Sopenharmony_ci 7647db96d56Sopenharmony_ci .. versionchanged:: 3.9 7657db96d56Sopenharmony_ci Added merge (``|``) and update (``|=``) operators, specified in 7667db96d56Sopenharmony_ci :pep:`584`. 7677db96d56Sopenharmony_ci 7687db96d56Sopenharmony_ci 7697db96d56Sopenharmony_ci:class:`defaultdict` Examples 7707db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 7717db96d56Sopenharmony_ci 7727db96d56Sopenharmony_ciUsing :class:`list` as the :attr:`~defaultdict.default_factory`, it is easy to group a 7737db96d56Sopenharmony_cisequence of key-value pairs into a dictionary of lists: 7747db96d56Sopenharmony_ci 7757db96d56Sopenharmony_ci >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] 7767db96d56Sopenharmony_ci >>> d = defaultdict(list) 7777db96d56Sopenharmony_ci >>> for k, v in s: 7787db96d56Sopenharmony_ci ... d[k].append(v) 7797db96d56Sopenharmony_ci ... 7807db96d56Sopenharmony_ci >>> sorted(d.items()) 7817db96d56Sopenharmony_ci [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] 7827db96d56Sopenharmony_ci 7837db96d56Sopenharmony_ciWhen each key is encountered for the first time, it is not already in the 7847db96d56Sopenharmony_cimapping; so an entry is automatically created using the :attr:`~defaultdict.default_factory` 7857db96d56Sopenharmony_cifunction which returns an empty :class:`list`. The :meth:`list.append` 7867db96d56Sopenharmony_cioperation then attaches the value to the new list. When keys are encountered 7877db96d56Sopenharmony_ciagain, the look-up proceeds normally (returning the list for that key) and the 7887db96d56Sopenharmony_ci:meth:`list.append` operation adds another value to the list. This technique is 7897db96d56Sopenharmony_cisimpler and faster than an equivalent technique using :meth:`dict.setdefault`: 7907db96d56Sopenharmony_ci 7917db96d56Sopenharmony_ci >>> d = {} 7927db96d56Sopenharmony_ci >>> for k, v in s: 7937db96d56Sopenharmony_ci ... d.setdefault(k, []).append(v) 7947db96d56Sopenharmony_ci ... 7957db96d56Sopenharmony_ci >>> sorted(d.items()) 7967db96d56Sopenharmony_ci [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] 7977db96d56Sopenharmony_ci 7987db96d56Sopenharmony_ciSetting the :attr:`~defaultdict.default_factory` to :class:`int` makes the 7997db96d56Sopenharmony_ci:class:`defaultdict` useful for counting (like a bag or multiset in other 8007db96d56Sopenharmony_cilanguages): 8017db96d56Sopenharmony_ci 8027db96d56Sopenharmony_ci >>> s = 'mississippi' 8037db96d56Sopenharmony_ci >>> d = defaultdict(int) 8047db96d56Sopenharmony_ci >>> for k in s: 8057db96d56Sopenharmony_ci ... d[k] += 1 8067db96d56Sopenharmony_ci ... 8077db96d56Sopenharmony_ci >>> sorted(d.items()) 8087db96d56Sopenharmony_ci [('i', 4), ('m', 1), ('p', 2), ('s', 4)] 8097db96d56Sopenharmony_ci 8107db96d56Sopenharmony_ciWhen a letter is first encountered, it is missing from the mapping, so the 8117db96d56Sopenharmony_ci:attr:`~defaultdict.default_factory` function calls :func:`int` to supply a default count of 8127db96d56Sopenharmony_cizero. The increment operation then builds up the count for each letter. 8137db96d56Sopenharmony_ci 8147db96d56Sopenharmony_ciThe function :func:`int` which always returns zero is just a special case of 8157db96d56Sopenharmony_ciconstant functions. A faster and more flexible way to create constant functions 8167db96d56Sopenharmony_ciis to use a lambda function which can supply any constant value (not just 8177db96d56Sopenharmony_cizero): 8187db96d56Sopenharmony_ci 8197db96d56Sopenharmony_ci >>> def constant_factory(value): 8207db96d56Sopenharmony_ci ... return lambda: value 8217db96d56Sopenharmony_ci >>> d = defaultdict(constant_factory('<missing>')) 8227db96d56Sopenharmony_ci >>> d.update(name='John', action='ran') 8237db96d56Sopenharmony_ci >>> '%(name)s %(action)s to %(object)s' % d 8247db96d56Sopenharmony_ci 'John ran to <missing>' 8257db96d56Sopenharmony_ci 8267db96d56Sopenharmony_ciSetting the :attr:`~defaultdict.default_factory` to :class:`set` makes the 8277db96d56Sopenharmony_ci:class:`defaultdict` useful for building a dictionary of sets: 8287db96d56Sopenharmony_ci 8297db96d56Sopenharmony_ci >>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)] 8307db96d56Sopenharmony_ci >>> d = defaultdict(set) 8317db96d56Sopenharmony_ci >>> for k, v in s: 8327db96d56Sopenharmony_ci ... d[k].add(v) 8337db96d56Sopenharmony_ci ... 8347db96d56Sopenharmony_ci >>> sorted(d.items()) 8357db96d56Sopenharmony_ci [('blue', {2, 4}), ('red', {1, 3})] 8367db96d56Sopenharmony_ci 8377db96d56Sopenharmony_ci 8387db96d56Sopenharmony_ci:func:`namedtuple` Factory Function for Tuples with Named Fields 8397db96d56Sopenharmony_ci---------------------------------------------------------------- 8407db96d56Sopenharmony_ci 8417db96d56Sopenharmony_ciNamed tuples assign meaning to each position in a tuple and allow for more readable, 8427db96d56Sopenharmony_ciself-documenting code. They can be used wherever regular tuples are used, and 8437db96d56Sopenharmony_cithey add the ability to access fields by name instead of position index. 8447db96d56Sopenharmony_ci 8457db96d56Sopenharmony_ci.. function:: namedtuple(typename, field_names, *, rename=False, defaults=None, module=None) 8467db96d56Sopenharmony_ci 8477db96d56Sopenharmony_ci Returns a new tuple subclass named *typename*. The new subclass is used to 8487db96d56Sopenharmony_ci create tuple-like objects that have fields accessible by attribute lookup as 8497db96d56Sopenharmony_ci well as being indexable and iterable. Instances of the subclass also have a 8507db96d56Sopenharmony_ci helpful docstring (with typename and field_names) and a helpful :meth:`__repr__` 8517db96d56Sopenharmony_ci method which lists the tuple contents in a ``name=value`` format. 8527db96d56Sopenharmony_ci 8537db96d56Sopenharmony_ci The *field_names* are a sequence of strings such as ``['x', 'y']``. 8547db96d56Sopenharmony_ci Alternatively, *field_names* can be a single string with each fieldname 8557db96d56Sopenharmony_ci separated by whitespace and/or commas, for example ``'x y'`` or ``'x, y'``. 8567db96d56Sopenharmony_ci 8577db96d56Sopenharmony_ci Any valid Python identifier may be used for a fieldname except for names 8587db96d56Sopenharmony_ci starting with an underscore. Valid identifiers consist of letters, digits, 8597db96d56Sopenharmony_ci and underscores but do not start with a digit or underscore and cannot be 8607db96d56Sopenharmony_ci a :mod:`keyword` such as *class*, *for*, *return*, *global*, *pass*, 8617db96d56Sopenharmony_ci or *raise*. 8627db96d56Sopenharmony_ci 8637db96d56Sopenharmony_ci If *rename* is true, invalid fieldnames are automatically replaced 8647db96d56Sopenharmony_ci with positional names. For example, ``['abc', 'def', 'ghi', 'abc']`` is 8657db96d56Sopenharmony_ci converted to ``['abc', '_1', 'ghi', '_3']``, eliminating the keyword 8667db96d56Sopenharmony_ci ``def`` and the duplicate fieldname ``abc``. 8677db96d56Sopenharmony_ci 8687db96d56Sopenharmony_ci *defaults* can be ``None`` or an :term:`iterable` of default values. 8697db96d56Sopenharmony_ci Since fields with a default value must come after any fields without a 8707db96d56Sopenharmony_ci default, the *defaults* are applied to the rightmost parameters. For 8717db96d56Sopenharmony_ci example, if the fieldnames are ``['x', 'y', 'z']`` and the defaults are 8727db96d56Sopenharmony_ci ``(1, 2)``, then ``x`` will be a required argument, ``y`` will default to 8737db96d56Sopenharmony_ci ``1``, and ``z`` will default to ``2``. 8747db96d56Sopenharmony_ci 8757db96d56Sopenharmony_ci If *module* is defined, the ``__module__`` attribute of the named tuple is 8767db96d56Sopenharmony_ci set to that value. 8777db96d56Sopenharmony_ci 8787db96d56Sopenharmony_ci Named tuple instances do not have per-instance dictionaries, so they are 8797db96d56Sopenharmony_ci lightweight and require no more memory than regular tuples. 8807db96d56Sopenharmony_ci 8817db96d56Sopenharmony_ci To support pickling, the named tuple class should be assigned to a variable 8827db96d56Sopenharmony_ci that matches *typename*. 8837db96d56Sopenharmony_ci 8847db96d56Sopenharmony_ci .. versionchanged:: 3.1 8857db96d56Sopenharmony_ci Added support for *rename*. 8867db96d56Sopenharmony_ci 8877db96d56Sopenharmony_ci .. versionchanged:: 3.6 8887db96d56Sopenharmony_ci The *verbose* and *rename* parameters became 8897db96d56Sopenharmony_ci :ref:`keyword-only arguments <keyword-only_parameter>`. 8907db96d56Sopenharmony_ci 8917db96d56Sopenharmony_ci .. versionchanged:: 3.6 8927db96d56Sopenharmony_ci Added the *module* parameter. 8937db96d56Sopenharmony_ci 8947db96d56Sopenharmony_ci .. versionchanged:: 3.7 8957db96d56Sopenharmony_ci Removed the *verbose* parameter and the :attr:`_source` attribute. 8967db96d56Sopenharmony_ci 8977db96d56Sopenharmony_ci .. versionchanged:: 3.7 8987db96d56Sopenharmony_ci Added the *defaults* parameter and the :attr:`_field_defaults` 8997db96d56Sopenharmony_ci attribute. 9007db96d56Sopenharmony_ci 9017db96d56Sopenharmony_ci.. doctest:: 9027db96d56Sopenharmony_ci :options: +NORMALIZE_WHITESPACE 9037db96d56Sopenharmony_ci 9047db96d56Sopenharmony_ci >>> # Basic example 9057db96d56Sopenharmony_ci >>> Point = namedtuple('Point', ['x', 'y']) 9067db96d56Sopenharmony_ci >>> p = Point(11, y=22) # instantiate with positional or keyword arguments 9077db96d56Sopenharmony_ci >>> p[0] + p[1] # indexable like the plain tuple (11, 22) 9087db96d56Sopenharmony_ci 33 9097db96d56Sopenharmony_ci >>> x, y = p # unpack like a regular tuple 9107db96d56Sopenharmony_ci >>> x, y 9117db96d56Sopenharmony_ci (11, 22) 9127db96d56Sopenharmony_ci >>> p.x + p.y # fields also accessible by name 9137db96d56Sopenharmony_ci 33 9147db96d56Sopenharmony_ci >>> p # readable __repr__ with a name=value style 9157db96d56Sopenharmony_ci Point(x=11, y=22) 9167db96d56Sopenharmony_ci 9177db96d56Sopenharmony_ciNamed tuples are especially useful for assigning field names to result tuples returned 9187db96d56Sopenharmony_ciby the :mod:`csv` or :mod:`sqlite3` modules:: 9197db96d56Sopenharmony_ci 9207db96d56Sopenharmony_ci EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade') 9217db96d56Sopenharmony_ci 9227db96d56Sopenharmony_ci import csv 9237db96d56Sopenharmony_ci for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))): 9247db96d56Sopenharmony_ci print(emp.name, emp.title) 9257db96d56Sopenharmony_ci 9267db96d56Sopenharmony_ci import sqlite3 9277db96d56Sopenharmony_ci conn = sqlite3.connect('/companydata') 9287db96d56Sopenharmony_ci cursor = conn.cursor() 9297db96d56Sopenharmony_ci cursor.execute('SELECT name, age, title, department, paygrade FROM employees') 9307db96d56Sopenharmony_ci for emp in map(EmployeeRecord._make, cursor.fetchall()): 9317db96d56Sopenharmony_ci print(emp.name, emp.title) 9327db96d56Sopenharmony_ci 9337db96d56Sopenharmony_ciIn addition to the methods inherited from tuples, named tuples support 9347db96d56Sopenharmony_cithree additional methods and two attributes. To prevent conflicts with 9357db96d56Sopenharmony_cifield names, the method and attribute names start with an underscore. 9367db96d56Sopenharmony_ci 9377db96d56Sopenharmony_ci.. classmethod:: somenamedtuple._make(iterable) 9387db96d56Sopenharmony_ci 9397db96d56Sopenharmony_ci Class method that makes a new instance from an existing sequence or iterable. 9407db96d56Sopenharmony_ci 9417db96d56Sopenharmony_ci .. doctest:: 9427db96d56Sopenharmony_ci 9437db96d56Sopenharmony_ci >>> t = [11, 22] 9447db96d56Sopenharmony_ci >>> Point._make(t) 9457db96d56Sopenharmony_ci Point(x=11, y=22) 9467db96d56Sopenharmony_ci 9477db96d56Sopenharmony_ci.. method:: somenamedtuple._asdict() 9487db96d56Sopenharmony_ci 9497db96d56Sopenharmony_ci Return a new :class:`dict` which maps field names to their corresponding 9507db96d56Sopenharmony_ci values: 9517db96d56Sopenharmony_ci 9527db96d56Sopenharmony_ci .. doctest:: 9537db96d56Sopenharmony_ci 9547db96d56Sopenharmony_ci >>> p = Point(x=11, y=22) 9557db96d56Sopenharmony_ci >>> p._asdict() 9567db96d56Sopenharmony_ci {'x': 11, 'y': 22} 9577db96d56Sopenharmony_ci 9587db96d56Sopenharmony_ci .. versionchanged:: 3.1 9597db96d56Sopenharmony_ci Returns an :class:`OrderedDict` instead of a regular :class:`dict`. 9607db96d56Sopenharmony_ci 9617db96d56Sopenharmony_ci .. versionchanged:: 3.8 9627db96d56Sopenharmony_ci Returns a regular :class:`dict` instead of an :class:`OrderedDict`. 9637db96d56Sopenharmony_ci As of Python 3.7, regular dicts are guaranteed to be ordered. If the 9647db96d56Sopenharmony_ci extra features of :class:`OrderedDict` are required, the suggested 9657db96d56Sopenharmony_ci remediation is to cast the result to the desired type: 9667db96d56Sopenharmony_ci ``OrderedDict(nt._asdict())``. 9677db96d56Sopenharmony_ci 9687db96d56Sopenharmony_ci.. method:: somenamedtuple._replace(**kwargs) 9697db96d56Sopenharmony_ci 9707db96d56Sopenharmony_ci Return a new instance of the named tuple replacing specified fields with new 9717db96d56Sopenharmony_ci values:: 9727db96d56Sopenharmony_ci 9737db96d56Sopenharmony_ci >>> p = Point(x=11, y=22) 9747db96d56Sopenharmony_ci >>> p._replace(x=33) 9757db96d56Sopenharmony_ci Point(x=33, y=22) 9767db96d56Sopenharmony_ci 9777db96d56Sopenharmony_ci >>> for partnum, record in inventory.items(): 9787db96d56Sopenharmony_ci ... inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now()) 9797db96d56Sopenharmony_ci 9807db96d56Sopenharmony_ci.. attribute:: somenamedtuple._fields 9817db96d56Sopenharmony_ci 9827db96d56Sopenharmony_ci Tuple of strings listing the field names. Useful for introspection 9837db96d56Sopenharmony_ci and for creating new named tuple types from existing named tuples. 9847db96d56Sopenharmony_ci 9857db96d56Sopenharmony_ci .. doctest:: 9867db96d56Sopenharmony_ci 9877db96d56Sopenharmony_ci >>> p._fields # view the field names 9887db96d56Sopenharmony_ci ('x', 'y') 9897db96d56Sopenharmony_ci 9907db96d56Sopenharmony_ci >>> Color = namedtuple('Color', 'red green blue') 9917db96d56Sopenharmony_ci >>> Pixel = namedtuple('Pixel', Point._fields + Color._fields) 9927db96d56Sopenharmony_ci >>> Pixel(11, 22, 128, 255, 0) 9937db96d56Sopenharmony_ci Pixel(x=11, y=22, red=128, green=255, blue=0) 9947db96d56Sopenharmony_ci 9957db96d56Sopenharmony_ci.. attribute:: somenamedtuple._field_defaults 9967db96d56Sopenharmony_ci 9977db96d56Sopenharmony_ci Dictionary mapping field names to default values. 9987db96d56Sopenharmony_ci 9997db96d56Sopenharmony_ci .. doctest:: 10007db96d56Sopenharmony_ci 10017db96d56Sopenharmony_ci >>> Account = namedtuple('Account', ['type', 'balance'], defaults=[0]) 10027db96d56Sopenharmony_ci >>> Account._field_defaults 10037db96d56Sopenharmony_ci {'balance': 0} 10047db96d56Sopenharmony_ci >>> Account('premium') 10057db96d56Sopenharmony_ci Account(type='premium', balance=0) 10067db96d56Sopenharmony_ci 10077db96d56Sopenharmony_ciTo retrieve a field whose name is stored in a string, use the :func:`getattr` 10087db96d56Sopenharmony_cifunction: 10097db96d56Sopenharmony_ci 10107db96d56Sopenharmony_ci >>> getattr(p, 'x') 10117db96d56Sopenharmony_ci 11 10127db96d56Sopenharmony_ci 10137db96d56Sopenharmony_ciTo convert a dictionary to a named tuple, use the double-star-operator 10147db96d56Sopenharmony_ci(as described in :ref:`tut-unpacking-arguments`): 10157db96d56Sopenharmony_ci 10167db96d56Sopenharmony_ci >>> d = {'x': 11, 'y': 22} 10177db96d56Sopenharmony_ci >>> Point(**d) 10187db96d56Sopenharmony_ci Point(x=11, y=22) 10197db96d56Sopenharmony_ci 10207db96d56Sopenharmony_ciSince a named tuple is a regular Python class, it is easy to add or change 10217db96d56Sopenharmony_cifunctionality with a subclass. Here is how to add a calculated field and 10227db96d56Sopenharmony_cia fixed-width print format: 10237db96d56Sopenharmony_ci 10247db96d56Sopenharmony_ci.. doctest:: 10257db96d56Sopenharmony_ci 10267db96d56Sopenharmony_ci >>> class Point(namedtuple('Point', ['x', 'y'])): 10277db96d56Sopenharmony_ci ... __slots__ = () 10287db96d56Sopenharmony_ci ... @property 10297db96d56Sopenharmony_ci ... def hypot(self): 10307db96d56Sopenharmony_ci ... return (self.x ** 2 + self.y ** 2) ** 0.5 10317db96d56Sopenharmony_ci ... def __str__(self): 10327db96d56Sopenharmony_ci ... return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot) 10337db96d56Sopenharmony_ci 10347db96d56Sopenharmony_ci >>> for p in Point(3, 4), Point(14, 5/7): 10357db96d56Sopenharmony_ci ... print(p) 10367db96d56Sopenharmony_ci Point: x= 3.000 y= 4.000 hypot= 5.000 10377db96d56Sopenharmony_ci Point: x=14.000 y= 0.714 hypot=14.018 10387db96d56Sopenharmony_ci 10397db96d56Sopenharmony_ciThe subclass shown above sets ``__slots__`` to an empty tuple. This helps 10407db96d56Sopenharmony_cikeep memory requirements low by preventing the creation of instance dictionaries. 10417db96d56Sopenharmony_ci 10427db96d56Sopenharmony_ciSubclassing is not useful for adding new, stored fields. Instead, simply 10437db96d56Sopenharmony_cicreate a new named tuple type from the :attr:`~somenamedtuple._fields` attribute: 10447db96d56Sopenharmony_ci 10457db96d56Sopenharmony_ci >>> Point3D = namedtuple('Point3D', Point._fields + ('z',)) 10467db96d56Sopenharmony_ci 10477db96d56Sopenharmony_ciDocstrings can be customized by making direct assignments to the ``__doc__`` 10487db96d56Sopenharmony_cifields: 10497db96d56Sopenharmony_ci 10507db96d56Sopenharmony_ci >>> Book = namedtuple('Book', ['id', 'title', 'authors']) 10517db96d56Sopenharmony_ci >>> Book.__doc__ += ': Hardcover book in active collection' 10527db96d56Sopenharmony_ci >>> Book.id.__doc__ = '13-digit ISBN' 10537db96d56Sopenharmony_ci >>> Book.title.__doc__ = 'Title of first printing' 10547db96d56Sopenharmony_ci >>> Book.authors.__doc__ = 'List of authors sorted by last name' 10557db96d56Sopenharmony_ci 10567db96d56Sopenharmony_ci.. versionchanged:: 3.5 10577db96d56Sopenharmony_ci Property docstrings became writeable. 10587db96d56Sopenharmony_ci 10597db96d56Sopenharmony_ci.. seealso:: 10607db96d56Sopenharmony_ci 10617db96d56Sopenharmony_ci * See :class:`typing.NamedTuple` for a way to add type hints for named 10627db96d56Sopenharmony_ci tuples. It also provides an elegant notation using the :keyword:`class` 10637db96d56Sopenharmony_ci keyword:: 10647db96d56Sopenharmony_ci 10657db96d56Sopenharmony_ci class Component(NamedTuple): 10667db96d56Sopenharmony_ci part_number: int 10677db96d56Sopenharmony_ci weight: float 10687db96d56Sopenharmony_ci description: Optional[str] = None 10697db96d56Sopenharmony_ci 10707db96d56Sopenharmony_ci * See :meth:`types.SimpleNamespace` for a mutable namespace based on an 10717db96d56Sopenharmony_ci underlying dictionary instead of a tuple. 10727db96d56Sopenharmony_ci 10737db96d56Sopenharmony_ci * The :mod:`dataclasses` module provides a decorator and functions for 10747db96d56Sopenharmony_ci automatically adding generated special methods to user-defined classes. 10757db96d56Sopenharmony_ci 10767db96d56Sopenharmony_ci 10777db96d56Sopenharmony_ci:class:`OrderedDict` objects 10787db96d56Sopenharmony_ci---------------------------- 10797db96d56Sopenharmony_ci 10807db96d56Sopenharmony_ciOrdered dictionaries are just like regular dictionaries but have some extra 10817db96d56Sopenharmony_cicapabilities relating to ordering operations. They have become less 10827db96d56Sopenharmony_ciimportant now that the built-in :class:`dict` class gained the ability 10837db96d56Sopenharmony_cito remember insertion order (this new behavior became guaranteed in 10847db96d56Sopenharmony_ciPython 3.7). 10857db96d56Sopenharmony_ci 10867db96d56Sopenharmony_ciSome differences from :class:`dict` still remain: 10877db96d56Sopenharmony_ci 10887db96d56Sopenharmony_ci* The regular :class:`dict` was designed to be very good at mapping 10897db96d56Sopenharmony_ci operations. Tracking insertion order was secondary. 10907db96d56Sopenharmony_ci 10917db96d56Sopenharmony_ci* The :class:`OrderedDict` was designed to be good at reordering operations. 10927db96d56Sopenharmony_ci Space efficiency, iteration speed, and the performance of update 10937db96d56Sopenharmony_ci operations were secondary. 10947db96d56Sopenharmony_ci 10957db96d56Sopenharmony_ci* The :class:`OrderedDict` algorithm can handle frequent reordering operations 10967db96d56Sopenharmony_ci better than :class:`dict`. As shown in the recipes below, this makes it 10977db96d56Sopenharmony_ci suitable for implementing various kinds of LRU caches. 10987db96d56Sopenharmony_ci 10997db96d56Sopenharmony_ci* The equality operation for :class:`OrderedDict` checks for matching order. 11007db96d56Sopenharmony_ci 11017db96d56Sopenharmony_ci A regular :class:`dict` can emulate the order sensitive equality test with 11027db96d56Sopenharmony_ci ``p == q and all(k1 == k2 for k1, k2 in zip(p, q))``. 11037db96d56Sopenharmony_ci 11047db96d56Sopenharmony_ci* The :meth:`popitem` method of :class:`OrderedDict` has a different 11057db96d56Sopenharmony_ci signature. It accepts an optional argument to specify which item is popped. 11067db96d56Sopenharmony_ci 11077db96d56Sopenharmony_ci A regular :class:`dict` can emulate OrderedDict's ``od.popitem(last=True)`` 11087db96d56Sopenharmony_ci with ``d.popitem()`` which is guaranteed to pop the rightmost (last) item. 11097db96d56Sopenharmony_ci 11107db96d56Sopenharmony_ci A regular :class:`dict` can emulate OrderedDict's ``od.popitem(last=False)`` 11117db96d56Sopenharmony_ci with ``(k := next(iter(d)), d.pop(k))`` which will return and remove the 11127db96d56Sopenharmony_ci leftmost (first) item if it exists. 11137db96d56Sopenharmony_ci 11147db96d56Sopenharmony_ci* :class:`OrderedDict` has a :meth:`move_to_end` method to efficiently 11157db96d56Sopenharmony_ci reposition an element to an endpoint. 11167db96d56Sopenharmony_ci 11177db96d56Sopenharmony_ci A regular :class:`dict` can emulate OrderedDict's ``od.move_to_end(k, 11187db96d56Sopenharmony_ci last=True)`` with ``d[k] = d.pop(k)`` which will move the key and its 11197db96d56Sopenharmony_ci associated value to the rightmost (last) position. 11207db96d56Sopenharmony_ci 11217db96d56Sopenharmony_ci A regular :class:`dict` does not have an efficient equivalent for 11227db96d56Sopenharmony_ci OrderedDict's ``od.move_to_end(k, last=False)`` which moves the key 11237db96d56Sopenharmony_ci and its associated value to the leftmost (first) position. 11247db96d56Sopenharmony_ci 11257db96d56Sopenharmony_ci* Until Python 3.8, :class:`dict` lacked a :meth:`__reversed__` method. 11267db96d56Sopenharmony_ci 11277db96d56Sopenharmony_ci 11287db96d56Sopenharmony_ci.. class:: OrderedDict([items]) 11297db96d56Sopenharmony_ci 11307db96d56Sopenharmony_ci Return an instance of a :class:`dict` subclass that has methods 11317db96d56Sopenharmony_ci specialized for rearranging dictionary order. 11327db96d56Sopenharmony_ci 11337db96d56Sopenharmony_ci .. versionadded:: 3.1 11347db96d56Sopenharmony_ci 11357db96d56Sopenharmony_ci .. method:: popitem(last=True) 11367db96d56Sopenharmony_ci 11377db96d56Sopenharmony_ci The :meth:`popitem` method for ordered dictionaries returns and removes a 11387db96d56Sopenharmony_ci (key, value) pair. The pairs are returned in 11397db96d56Sopenharmony_ci :abbr:`LIFO (last-in, first-out)` order if *last* is true 11407db96d56Sopenharmony_ci or :abbr:`FIFO (first-in, first-out)` order if false. 11417db96d56Sopenharmony_ci 11427db96d56Sopenharmony_ci .. method:: move_to_end(key, last=True) 11437db96d56Sopenharmony_ci 11447db96d56Sopenharmony_ci Move an existing *key* to either end of an ordered dictionary. The item 11457db96d56Sopenharmony_ci is moved to the right end if *last* is true (the default) or to the 11467db96d56Sopenharmony_ci beginning if *last* is false. Raises :exc:`KeyError` if the *key* does 11477db96d56Sopenharmony_ci not exist: 11487db96d56Sopenharmony_ci 11497db96d56Sopenharmony_ci .. doctest:: 11507db96d56Sopenharmony_ci 11517db96d56Sopenharmony_ci >>> d = OrderedDict.fromkeys('abcde') 11527db96d56Sopenharmony_ci >>> d.move_to_end('b') 11537db96d56Sopenharmony_ci >>> ''.join(d) 11547db96d56Sopenharmony_ci 'acdeb' 11557db96d56Sopenharmony_ci >>> d.move_to_end('b', last=False) 11567db96d56Sopenharmony_ci >>> ''.join(d) 11577db96d56Sopenharmony_ci 'bacde' 11587db96d56Sopenharmony_ci 11597db96d56Sopenharmony_ci .. versionadded:: 3.2 11607db96d56Sopenharmony_ci 11617db96d56Sopenharmony_ciIn addition to the usual mapping methods, ordered dictionaries also support 11627db96d56Sopenharmony_cireverse iteration using :func:`reversed`. 11637db96d56Sopenharmony_ci 11647db96d56Sopenharmony_ciEquality tests between :class:`OrderedDict` objects are order-sensitive 11657db96d56Sopenharmony_ciand are implemented as ``list(od1.items())==list(od2.items())``. 11667db96d56Sopenharmony_ciEquality tests between :class:`OrderedDict` objects and other 11677db96d56Sopenharmony_ci:class:`~collections.abc.Mapping` objects are order-insensitive like regular 11687db96d56Sopenharmony_cidictionaries. This allows :class:`OrderedDict` objects to be substituted 11697db96d56Sopenharmony_cianywhere a regular dictionary is used. 11707db96d56Sopenharmony_ci 11717db96d56Sopenharmony_ci.. versionchanged:: 3.5 11727db96d56Sopenharmony_ci The items, keys, and values :term:`views <dictionary view>` 11737db96d56Sopenharmony_ci of :class:`OrderedDict` now support reverse iteration using :func:`reversed`. 11747db96d56Sopenharmony_ci 11757db96d56Sopenharmony_ci.. versionchanged:: 3.6 11767db96d56Sopenharmony_ci With the acceptance of :pep:`468`, order is retained for keyword arguments 11777db96d56Sopenharmony_ci passed to the :class:`OrderedDict` constructor and its :meth:`update` 11787db96d56Sopenharmony_ci method. 11797db96d56Sopenharmony_ci 11807db96d56Sopenharmony_ci.. versionchanged:: 3.9 11817db96d56Sopenharmony_ci Added merge (``|``) and update (``|=``) operators, specified in :pep:`584`. 11827db96d56Sopenharmony_ci 11837db96d56Sopenharmony_ci 11847db96d56Sopenharmony_ci:class:`OrderedDict` Examples and Recipes 11857db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 11867db96d56Sopenharmony_ci 11877db96d56Sopenharmony_ciIt is straightforward to create an ordered dictionary variant 11887db96d56Sopenharmony_cithat remembers the order the keys were *last* inserted. 11897db96d56Sopenharmony_ciIf a new entry overwrites an existing entry, the 11907db96d56Sopenharmony_cioriginal insertion position is changed and moved to the end:: 11917db96d56Sopenharmony_ci 11927db96d56Sopenharmony_ci class LastUpdatedOrderedDict(OrderedDict): 11937db96d56Sopenharmony_ci 'Store items in the order the keys were last added' 11947db96d56Sopenharmony_ci 11957db96d56Sopenharmony_ci def __setitem__(self, key, value): 11967db96d56Sopenharmony_ci super().__setitem__(key, value) 11977db96d56Sopenharmony_ci self.move_to_end(key) 11987db96d56Sopenharmony_ci 11997db96d56Sopenharmony_ciAn :class:`OrderedDict` would also be useful for implementing 12007db96d56Sopenharmony_civariants of :func:`functools.lru_cache`: 12017db96d56Sopenharmony_ci 12027db96d56Sopenharmony_ci.. testcode:: 12037db96d56Sopenharmony_ci 12047db96d56Sopenharmony_ci from time import time 12057db96d56Sopenharmony_ci 12067db96d56Sopenharmony_ci class TimeBoundedLRU: 12077db96d56Sopenharmony_ci "LRU Cache that invalidates and refreshes old entries." 12087db96d56Sopenharmony_ci 12097db96d56Sopenharmony_ci def __init__(self, func, maxsize=128, maxage=30): 12107db96d56Sopenharmony_ci self.cache = OrderedDict() # { args : (timestamp, result)} 12117db96d56Sopenharmony_ci self.func = func 12127db96d56Sopenharmony_ci self.maxsize = maxsize 12137db96d56Sopenharmony_ci self.maxage = maxage 12147db96d56Sopenharmony_ci 12157db96d56Sopenharmony_ci def __call__(self, *args): 12167db96d56Sopenharmony_ci if args in self.cache: 12177db96d56Sopenharmony_ci self.cache.move_to_end(args) 12187db96d56Sopenharmony_ci timestamp, result = self.cache[args] 12197db96d56Sopenharmony_ci if time() - timestamp <= self.maxage: 12207db96d56Sopenharmony_ci return result 12217db96d56Sopenharmony_ci result = self.func(*args) 12227db96d56Sopenharmony_ci self.cache[args] = time(), result 12237db96d56Sopenharmony_ci if len(self.cache) > self.maxsize: 12247db96d56Sopenharmony_ci self.cache.popitem(0) 12257db96d56Sopenharmony_ci return result 12267db96d56Sopenharmony_ci 12277db96d56Sopenharmony_ci 12287db96d56Sopenharmony_ci.. testcode:: 12297db96d56Sopenharmony_ci 12307db96d56Sopenharmony_ci class MultiHitLRUCache: 12317db96d56Sopenharmony_ci """ LRU cache that defers caching a result until 12327db96d56Sopenharmony_ci it has been requested multiple times. 12337db96d56Sopenharmony_ci 12347db96d56Sopenharmony_ci To avoid flushing the LRU cache with one-time requests, 12357db96d56Sopenharmony_ci we don't cache until a request has been made more than once. 12367db96d56Sopenharmony_ci 12377db96d56Sopenharmony_ci """ 12387db96d56Sopenharmony_ci 12397db96d56Sopenharmony_ci def __init__(self, func, maxsize=128, maxrequests=4096, cache_after=1): 12407db96d56Sopenharmony_ci self.requests = OrderedDict() # { uncached_key : request_count } 12417db96d56Sopenharmony_ci self.cache = OrderedDict() # { cached_key : function_result } 12427db96d56Sopenharmony_ci self.func = func 12437db96d56Sopenharmony_ci self.maxrequests = maxrequests # max number of uncached requests 12447db96d56Sopenharmony_ci self.maxsize = maxsize # max number of stored return values 12457db96d56Sopenharmony_ci self.cache_after = cache_after 12467db96d56Sopenharmony_ci 12477db96d56Sopenharmony_ci def __call__(self, *args): 12487db96d56Sopenharmony_ci if args in self.cache: 12497db96d56Sopenharmony_ci self.cache.move_to_end(args) 12507db96d56Sopenharmony_ci return self.cache[args] 12517db96d56Sopenharmony_ci result = self.func(*args) 12527db96d56Sopenharmony_ci self.requests[args] = self.requests.get(args, 0) + 1 12537db96d56Sopenharmony_ci if self.requests[args] <= self.cache_after: 12547db96d56Sopenharmony_ci self.requests.move_to_end(args) 12557db96d56Sopenharmony_ci if len(self.requests) > self.maxrequests: 12567db96d56Sopenharmony_ci self.requests.popitem(0) 12577db96d56Sopenharmony_ci else: 12587db96d56Sopenharmony_ci self.requests.pop(args, None) 12597db96d56Sopenharmony_ci self.cache[args] = result 12607db96d56Sopenharmony_ci if len(self.cache) > self.maxsize: 12617db96d56Sopenharmony_ci self.cache.popitem(0) 12627db96d56Sopenharmony_ci return result 12637db96d56Sopenharmony_ci 12647db96d56Sopenharmony_ci.. doctest:: 12657db96d56Sopenharmony_ci :hide: 12667db96d56Sopenharmony_ci 12677db96d56Sopenharmony_ci >>> def square(x): 12687db96d56Sopenharmony_ci ... return x * x 12697db96d56Sopenharmony_ci ... 12707db96d56Sopenharmony_ci >>> f = MultiHitLRUCache(square, maxsize=4, maxrequests=6) 12717db96d56Sopenharmony_ci >>> list(map(f, range(10))) # First requests, don't cache 12727db96d56Sopenharmony_ci [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 12737db96d56Sopenharmony_ci >>> f(4) # Cache the second request 12747db96d56Sopenharmony_ci 16 12757db96d56Sopenharmony_ci >>> f(6) # Cache the second request 12767db96d56Sopenharmony_ci 36 12777db96d56Sopenharmony_ci >>> f(2) # The first request aged out, so don't cache 12787db96d56Sopenharmony_ci 4 12797db96d56Sopenharmony_ci >>> f(6) # Cache hit 12807db96d56Sopenharmony_ci 36 12817db96d56Sopenharmony_ci >>> f(4) # Cache hit and move to front 12827db96d56Sopenharmony_ci 16 12837db96d56Sopenharmony_ci >>> list(f.cache.values()) 12847db96d56Sopenharmony_ci [36, 16] 12857db96d56Sopenharmony_ci >>> set(f.requests).isdisjoint(f.cache) 12867db96d56Sopenharmony_ci True 12877db96d56Sopenharmony_ci >>> list(map(f, [9, 8, 7])) # Cache these second requests 12887db96d56Sopenharmony_ci [81, 64, 49] 12897db96d56Sopenharmony_ci >>> list(map(f, [7, 9])) # Cache hits 12907db96d56Sopenharmony_ci [49, 81] 12917db96d56Sopenharmony_ci >>> list(f.cache.values()) 12927db96d56Sopenharmony_ci [16, 64, 49, 81] 12937db96d56Sopenharmony_ci >>> set(f.requests).isdisjoint(f.cache) 12947db96d56Sopenharmony_ci True 12957db96d56Sopenharmony_ci 12967db96d56Sopenharmony_ci:class:`UserDict` objects 12977db96d56Sopenharmony_ci------------------------- 12987db96d56Sopenharmony_ci 12997db96d56Sopenharmony_ciThe class, :class:`UserDict` acts as a wrapper around dictionary objects. 13007db96d56Sopenharmony_ciThe need for this class has been partially supplanted by the ability to 13017db96d56Sopenharmony_cisubclass directly from :class:`dict`; however, this class can be easier 13027db96d56Sopenharmony_cito work with because the underlying dictionary is accessible as an 13037db96d56Sopenharmony_ciattribute. 13047db96d56Sopenharmony_ci 13057db96d56Sopenharmony_ci.. class:: UserDict([initialdata]) 13067db96d56Sopenharmony_ci 13077db96d56Sopenharmony_ci Class that simulates a dictionary. The instance's contents are kept in a 13087db96d56Sopenharmony_ci regular dictionary, which is accessible via the :attr:`data` attribute of 13097db96d56Sopenharmony_ci :class:`UserDict` instances. If *initialdata* is provided, :attr:`data` is 13107db96d56Sopenharmony_ci initialized with its contents; note that a reference to *initialdata* will not 13117db96d56Sopenharmony_ci be kept, allowing it to be used for other purposes. 13127db96d56Sopenharmony_ci 13137db96d56Sopenharmony_ci In addition to supporting the methods and operations of mappings, 13147db96d56Sopenharmony_ci :class:`UserDict` instances provide the following attribute: 13157db96d56Sopenharmony_ci 13167db96d56Sopenharmony_ci .. attribute:: data 13177db96d56Sopenharmony_ci 13187db96d56Sopenharmony_ci A real dictionary used to store the contents of the :class:`UserDict` 13197db96d56Sopenharmony_ci class. 13207db96d56Sopenharmony_ci 13217db96d56Sopenharmony_ci 13227db96d56Sopenharmony_ci 13237db96d56Sopenharmony_ci:class:`UserList` objects 13247db96d56Sopenharmony_ci------------------------- 13257db96d56Sopenharmony_ci 13267db96d56Sopenharmony_ciThis class acts as a wrapper around list objects. It is a useful base class 13277db96d56Sopenharmony_cifor your own list-like classes which can inherit from them and override 13287db96d56Sopenharmony_ciexisting methods or add new ones. In this way, one can add new behaviors to 13297db96d56Sopenharmony_cilists. 13307db96d56Sopenharmony_ci 13317db96d56Sopenharmony_ciThe need for this class has been partially supplanted by the ability to 13327db96d56Sopenharmony_cisubclass directly from :class:`list`; however, this class can be easier 13337db96d56Sopenharmony_cito work with because the underlying list is accessible as an attribute. 13347db96d56Sopenharmony_ci 13357db96d56Sopenharmony_ci.. class:: UserList([list]) 13367db96d56Sopenharmony_ci 13377db96d56Sopenharmony_ci Class that simulates a list. The instance's contents are kept in a regular 13387db96d56Sopenharmony_ci list, which is accessible via the :attr:`data` attribute of :class:`UserList` 13397db96d56Sopenharmony_ci instances. The instance's contents are initially set to a copy of *list*, 13407db96d56Sopenharmony_ci defaulting to the empty list ``[]``. *list* can be any iterable, for 13417db96d56Sopenharmony_ci example a real Python list or a :class:`UserList` object. 13427db96d56Sopenharmony_ci 13437db96d56Sopenharmony_ci In addition to supporting the methods and operations of mutable sequences, 13447db96d56Sopenharmony_ci :class:`UserList` instances provide the following attribute: 13457db96d56Sopenharmony_ci 13467db96d56Sopenharmony_ci .. attribute:: data 13477db96d56Sopenharmony_ci 13487db96d56Sopenharmony_ci A real :class:`list` object used to store the contents of the 13497db96d56Sopenharmony_ci :class:`UserList` class. 13507db96d56Sopenharmony_ci 13517db96d56Sopenharmony_ci**Subclassing requirements:** Subclasses of :class:`UserList` are expected to 13527db96d56Sopenharmony_cioffer a constructor which can be called with either no arguments or one 13537db96d56Sopenharmony_ciargument. List operations which return a new sequence attempt to create an 13547db96d56Sopenharmony_ciinstance of the actual implementation class. To do so, it assumes that the 13557db96d56Sopenharmony_ciconstructor can be called with a single parameter, which is a sequence object 13567db96d56Sopenharmony_ciused as a data source. 13577db96d56Sopenharmony_ci 13587db96d56Sopenharmony_ciIf a derived class does not wish to comply with this requirement, all of the 13597db96d56Sopenharmony_cispecial methods supported by this class will need to be overridden; please 13607db96d56Sopenharmony_ciconsult the sources for information about the methods which need to be provided 13617db96d56Sopenharmony_ciin that case. 13627db96d56Sopenharmony_ci 13637db96d56Sopenharmony_ci:class:`UserString` objects 13647db96d56Sopenharmony_ci--------------------------- 13657db96d56Sopenharmony_ci 13667db96d56Sopenharmony_ciThe class, :class:`UserString` acts as a wrapper around string objects. 13677db96d56Sopenharmony_ciThe need for this class has been partially supplanted by the ability to 13687db96d56Sopenharmony_cisubclass directly from :class:`str`; however, this class can be easier 13697db96d56Sopenharmony_cito work with because the underlying string is accessible as an 13707db96d56Sopenharmony_ciattribute. 13717db96d56Sopenharmony_ci 13727db96d56Sopenharmony_ci.. class:: UserString(seq) 13737db96d56Sopenharmony_ci 13747db96d56Sopenharmony_ci Class that simulates a string object. The instance's 13757db96d56Sopenharmony_ci content is kept in a regular string object, which is accessible via the 13767db96d56Sopenharmony_ci :attr:`data` attribute of :class:`UserString` instances. The instance's 13777db96d56Sopenharmony_ci contents are initially set to a copy of *seq*. The *seq* argument can 13787db96d56Sopenharmony_ci be any object which can be converted into a string using the built-in 13797db96d56Sopenharmony_ci :func:`str` function. 13807db96d56Sopenharmony_ci 13817db96d56Sopenharmony_ci In addition to supporting the methods and operations of strings, 13827db96d56Sopenharmony_ci :class:`UserString` instances provide the following attribute: 13837db96d56Sopenharmony_ci 13847db96d56Sopenharmony_ci .. attribute:: data 13857db96d56Sopenharmony_ci 13867db96d56Sopenharmony_ci A real :class:`str` object used to store the contents of the 13877db96d56Sopenharmony_ci :class:`UserString` class. 13887db96d56Sopenharmony_ci 13897db96d56Sopenharmony_ci .. versionchanged:: 3.5 13907db96d56Sopenharmony_ci New methods ``__getnewargs__``, ``__rmod__``, ``casefold``, 13917db96d56Sopenharmony_ci ``format_map``, ``isprintable``, and ``maketrans``. 1392