<>collections modular
This module implements the container for a specific purpose , To provide Python Standard built in containers dict,list,set,tuple Alternative options for .
* Counter: Subclasses of dictionaries , Provides the counting function of hashable objects
* defaultdict: Subclasses of dictionaries , Provides a factory function , Default values are provided for dictionary queries
* OrderedDict: Subclasses of dictionaries , It retains the order in which they were added
* namedtuple: Factory function for creating named tuple subclasses
* deque: Similar to list container , It realizes the rapid addition at both ends (append) And pop up (pop)
* ChainMap: Dictionary like container class , Assemble multiple mappings into a view
<>Counter
Counter It's a dict Subclass , It is mainly used to count the frequency of objects you visit .
>>> import collections >>> # Count the number of times a character appears ... collections.Counter('hello world')
Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1}) >>> #
Count the number of words ... collections.Counter('hello world hello lucy'.split()) Counter({
'hello': 2, 'world': 1, 'lucy': 1})
common method :
*
elements(): Returns an iterator , The number of repetitions per element , If the count of an element is less than 1, Will be ignored
*
most_common([n]): Returns a list , provide n Most frequently accessed elements and counts
*
subtract([iterable-or-mapping]): Subtracting elements from iterated objects , The input and output can be 0 Or negative
*
update([iterable-or-mapping]): Count elements from an iterated object or from another Mapping objects ( Or counter ) add to
>>> c = collections.Counter('hello world hello lucy'.split()) >>> c Counter({
'hello': 2, 'world': 1, 'lucy': 1}) >>> # Gets the number of accesses to the specified object , It can also be used get method ... c['hello']
2 >>> # View elements ... list(c.elements()) ['hello', 'hello', 'world', 'lucy'] >>> c1 =
collections.Counter('hello world'.split()) >>> c2 = collections.Counter('hello
lucy'.split()) >>> c1 Counter({'hello': 1, 'world': 1}) >>> c2 Counter({'hello':
1, 'lucy': 1}) >>> # Append object ,+ perhaps c1.update(c2) ... c1+c2 Counter({'hello': 2,
'world': 1, 'lucy': 1}) >>> # Reduce objects ,- perhaps c1.subtract(c2) ... c1-c2 Counter({'world'
: 1}) >>> # eliminate ... c.clear() >>> c Counter()
<>defaultdict
Returns a new dictionary like object . defaultdict It's built-in dict Subclass of class .
class collections.defaultdict([default_factory[, ...]])
>>> d = collections.defaultdict() >>> d defaultdict(None, {}) >>> e =
collections.defaultdict(str) >>> e defaultdict(<class 'str'>, {})
example
defaultdict A typical use of is to use one of the built-in types ( as str,int,list or dict etc. ) As default factory , These built-in types return null types when called without parameters .
>>> e = collections.defaultdict(str) >>> e defaultdict(<class 'str'>, {}) >>> e
['hello'] '' >>> e defaultdict(<class 'str'>, {'hello': ''}) >>> #
When a normal dictionary calls a nonexistent key , report errors ... e1 = {} >>> e1['hello'] Traceback (most recent call last):
File"<stdin>", line 1, in <module> KeyError: 'hello'
use int As default_factory
>>> fruit = collections.defaultdict(int) >>> fruit['apple'] = 2 >>> fruit
defaultdict(<class 'int'>, {'apple': 2}) >>> fruit['banana'] # When there is no object , return 0 0 >>>
fruit defaultdict(<class 'int'>, {'apple': 2, 'banana': 0})
use list As default_factory
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] >>
> d = collections.defaultdict(list) >>> for k,v in s: ... d[k].append(v) ... >>>
d defaultdict(<class 'list'>, {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]})
>>> d.items() dict_items([('yellow', [1, 3]), ('blue', [2, 4]), ('red', [1])])
>>> sorted(d.items()) [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
use dict As default_factory
>>> nums = collections.defaultdict(dict) >>> nums[1] = {'one':1} >>> nums
defaultdict(<class 'dict'>, {1: {'one': 1}}) >>> nums[2] {} >>> nums defaultdict
(<class 'dict'>, {1: {'one': 1}, 2: {}})
use set As default_factory
>>> types = collections.defaultdict(set) >>> types[' mobile phone '].add(' Huawei ') >>> types[
' mobile phone '].add(' millet ') >>> types[' monitor '].add('AOC') >>> types defaultdict(<class 'set'>,
{' mobile phone ': {' Huawei ', ' millet '}, ' monitor ': {'AOC'}})
<>OrderedDict
Python The order of the keys in the dictionary is arbitrary , They are not controlled by the order in which they are added .
collections.OrderedDict Class provides dictionary objects that retain the order in which they are added
>>> o = collections.OrderedDict() >>> o['k1'] = 'v1' >>> o['k3'] = 'v3' >>> o[
'k2'] = 'v2' >>> o OrderedDict([('k1', 'v1'), ('k3', 'v3'), ('k2', 'v2')])
If the key Add a new value on the , Will keep the original key Location of , And then overlay it value value .
>>> o['k1'] = 666 >>> o OrderedDict([('k1', 666), ('k3', 'v3'), ('k2', 'v2')])
>>> dict(o) {'k1': 666, 'k3': 'v3', 'k2': 'v2'}
<>namedtuple
Three methods of defining named tuple : The first argument is the constructor of the named tuple ( The following :Person1,Person2,Person3)
>>> P1 = collections.namedtuple('Person1',['name','age','height']) >>> P2 =
collections.namedtuple('Person2','name,age,height') >>> P3 = collections.
namedtuple('Person3','name age height')
Instantiate named tuples
>>> lucy = P1('lucy',23,180) >>> lucy Person1(name='lucy', age=23, height=180)
>>> jack = P2('jack',20,190) >>> jack Person2(name='jack', age=20, height=190)
>>> lucy.name # Directly through Instance name . attribute To call 'lucy' >>> lucy.age 23
<>deque
collections.deque Returns a new bidirectional queue object , Initialization from left to right ( How to use it append()), from iterable( Iteration object ) Data creation . If
iterable Not specified , The new queue is empty .
collections.deque Queues support thread safety , For add from both ends (append) Or pop it up (pop), Complexity O(1).
although list Objects also support similar operations , But the fixed length operation is optimized here (pop(0),insert(0,v)) Cost of .
If maxlen Not specified or None ,deque It can grow to any length . otherwise ,deque To the specified maximum length . Once the length of deque
It's full , When a new item is added , The same number of items pop up from the other end .
Methods supported :
* append(x): add to x To the right
* appendleft(x): add to x To the left
* clear(): Clear all elements , The length becomes 0
* copy(): Create a shallow copy
* count(x): Count the number of queues equal to x Elements of
* extend(iterable): Add on the right side of the queue iterable Elements in
* extendleft(iterable): Add to the left side of the queue iterable Elements in , notes : When adding on the left ,iterable The order of the parameters is added in reverse
* index(x[,start[,stop]]): Back to page x Elements ( from start Start the calculation , stay stop
before ). Returns the first match , If you don't find it , rise ValueError .
* insert(i,x): In position i insert x . notes : If inserted, it will result in a limit deque Over length maxlen The words of , Just one up IndexError .
* pop(): Remove the rightmost element
* popleft(): Remove the leftmost element
* remove(value): Remove the first one found value. Didn't throw it out ValueError
* reverse(): take deque Reverse permutation . return None .
* maxlen: Maximum length of queue , If there is no limit, it is None. >>> d = collections.deque(maxlen=10) >>> d deque(
[], maxlen=10) >>> d.extend('python') >>> [i.upper() for i in d] ['P', 'Y', 'T',
'H', 'O', 'N'] >>> d.append('e') >>> d.appendleft('f') >>> d.appendleft('g') >>>
d.appendleft('h') >>> d deque(['h', 'g', 'f', 'p', 'y', 't', 'h', 'o', 'n', 'e'
], maxlen=10) >>> d.appendleft('i') >>> d deque(['i', 'h', 'g', 'f', 'p', 'y',
't', 'h', 'o', 'n'], maxlen=10) >>> d.append('m') >>> d deque(['h', 'g', 'f',
'p', 'y', 't', 'h', 'o', 'n', 'm'], maxlen=10)
<>ChainMap
The background of the problem is that we have multiple dictionaries or maps , Want to merge them into a single map , Some people say it works update Merge , The problem with this is that a new data structure is created so that changes to the original dictionary are not synchronized . If you want to create a synchronous query method , have access to
ChainMap
Can be used to merge two or more dictionaries , When querying , Search from front to back . Easy to use :
>>> d1 = {'apple':1,'banana':2} >>> d2 = {'orange':2,'apple':3,'pike':1} >>>
combined1= collections.ChainMap(d1,d2) >>> combined2 = collections.ChainMap(d2,
d1) >>> combined1 ChainMap({'apple': 1, 'banana': 2}, {'orange': 2, 'apple': 3,
'pike': 1}) >>> combined2 ChainMap({'orange': 2, 'apple': 3, 'pike': 1}, {
'apple': 1, 'banana': 2}) >>> for k,v in combined1.items(): ... print(k,v) ...
orange2 apple 1 pike 1 banana 2 >>> for k,v in combined2.items(): ... print(k,v)
... apple 3 banana 2 orange 2 pike 1
One thing to note is to be right ChainMap When modifying, only the first dictionary will be modified , If the key does not exist in the first dictionary , Will be added .
>>> d1 = {'apple':1,'banana':2} >>> d2 = {'orange':2,'apple':3,'pike':1} >>> c
= collections.ChainMap(d1,d2) >>> c ChainMap({'apple': 1, 'banana': 2}, {
'orange': 2, 'apple': 3, 'pike': 1}) >>> c['apple'] 1 >>> c['apple'] = 2 >>> c
ChainMap({'apple': 2, 'banana': 2}, {'orange': 2, 'apple': 3, 'pike': 1}) >>> c[
'pike'] 1 >>> c['pike'] = 3 >>> c ChainMap({'apple': 2, 'banana': 2, 'pike': 3},
{'orange': 2, 'apple': 3, 'pike': 1})
In principle ,ChainMap
The dictionary is actually stored in a queue , When adding or deleting a dictionary, it will only be performed on the first dictionary , When searching, they will search in turn ,new_child()
Method essentially puts a dictionary before the first element of the list , The default is {}, and parents Is to remove the elements at the beginning of the list
>>> a = collections.ChainMap() >>> a['x'] = 1 >>> a ChainMap({'x': 1}) >>> b =
a.new_child() >>> b ChainMap({}, {'x': 1}) >>> b['x'] = 2 >>> b ChainMap({'x': 2
}, {'x': 1}) >>> b['y'] = 3 >>> b ChainMap({'x': 2, 'y': 3}, {'x': 1}) >>> a
ChainMap({'x': 1}) >>> c = a.new_child() >>> c ChainMap({}, {'x': 1}) >>> c['x']
= 1 >>> c['y'] = 1 >>> c ChainMap({'x': 1, 'y': 1}, {'x': 1}) >>> d = c.parents
>>> d ChainMap({'x': 1}) >>> d is a False >>> d == a True >>> a = {'x':1,'z':3}
>>> b = {'y':2,'z':4} >>> c = collections.ChainMap(a,b) >>> c ChainMap({'x': 1,
'z': 3}, {'y': 2, 'z': 4}) >>> c.maps [{'x': 1, 'z': 3}, {'y': 2, 'z': 4}] >>> c
.parents ChainMap({'y': 2, 'z': 4}) >>> c.parents.maps [{'y': 2, 'z': 4}] >>> c.
parents.parents ChainMap({}) >>> c.parents.parents.parents ChainMap({})
Technology