Python's collections module strengthens data structure

collections is a built-in collection module of Python, which provides many useful collection classes. Including many common enhanced data structure classes. As for why there is an enhanced data structure, it is naturally because general tuples, dictionaries, etc. may not meet some specific needs.

Counter

List element statistics

Ordinary realization

>>> word_list = ["a", "b", "c", "c", "a", "a"]
>>> cnt = {}
>>> for word in set(word_list):
...     cnt[word] = word_list.count(word)
... 
>>> cnt
{'b': 1, 'c': 2, 'a': 3}
>>> cnt['d']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'd'

Counter implementation 

>>> from collections import Counter
>>> cnt = Counter()
>>> word_list = ['a', 'b', 'c', 'c', 'a', 'a']
>>> for word in word_list:
...     cnt[word] += 1
... 
>>> cnt
Counter({'a': 3, 'c': 2, 'b': 1})
>>> cnt['a']
3
>>> cnt['d'] # 即使没有 key,也不会报 KeyError 哟,这点和 defaultdict(int) 比较像。
0

String character statistics

Ordinary realization

>>> word_str = 'hello world'
>>> word_list = list(word_str)
>>> cnt = {}
>>> for word in set(word_list):
...     cnt[word] = word_list.count(word)
... 
>>> cnt
{'e': 1, 'd': 1, 'h': 1, 'o': 2, 'l': 3, ' ': 1, 'r': 1, 'w': 1}

Counter implementation

>>> from collections import Counter
>>> word_str = 'hello world'
>>> cnt = Counter(word_str)
>>> cnt
Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

>>> Counter({'red': 4, 'blue': 2})
Counter({'red': 4, 'blue': 2})
>>> Counter(red=4, blue=2)
Counter({'red': 4, 'blue': 2})

Counter.elements()

>>> cnt = Counter(red=4, blue=2)
>>> cnt
Counter({'red': 4, 'blue': 2})
>>> list(cnt.elements())
['red', 'red', 'red', 'red', 'blue', 'blue']

Counter.most_common()

>>> cnt = Counter('hello world')
>>> cnt
Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
>>> cnt.most_common()
[('l', 3), ('o', 2), ('h', 1), ('e', 1), (' ', 1), ('w', 1), ('r', 1), ('d', 1)]
>>> cnt.most_common(3)
[('l', 3), ('o', 2), ('h', 1)]

Counter.subtract()

>>> a = Counter(a=4, b=2, c=0, d=-2)
>>> a
Counter({'a': 4, 'b': 2, 'c': 0, 'd': -2})
>>> b = Counter(a=1, b=2, c=-3, d=4)
>>> b
Counter({'d': 4, 'b': 2, 'a': 1, 'c': -3})
>>> a.subtract(b)
>>> a
Counter({'a': 3, 'c': 3, 'b': 0, 'd': -6})

Common operations

In fact, after converting to the Counter type, the operation is similar to that of a dictionary.

>>> from collections import Counter
>>> cnt = Counter('hello world')
>>> cnt
Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
>>> cnt.keys()
dict_keys(['h', 'e', 'l', 'o', ' ', 'w', 'r', 'd'])
>>> cnt.values()
dict_values([1, 1, 3, 2, 1, 1, 1, 1])
>>> sum(cnt.values())
11
>>> dict(cnt)
{'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}
>>> cnt.items()
dict_items([('h', 1), ('e', 1), ('l', 3), ('o', 2), (' ', 1), ('w', 1), ('r', 1), ('d', 1)])
>>> Counter(dict([('a', 1), ('b', 2), ('c', 3)]))
Counter({'c': 3, 'b': 2, 'a': 1})
>>> cnt.clear()
>>> cnt
Counter()

and

Deque is a generalized implementation of stacks and queues, commonly known as double-ended queues. Efficiently insert and delete elements at both ends of the deque with approximately O(1) performance. Although the list also supports similar operations, pop(0) and insert(0,v) (will change the location and size of the data) ) Has O(n) time complexity. If you ignore these details, it seems that there is nothing wrong with treating him as an enhanced list.

>>> from collections import deque
>>> 
>>> d = deque(['a', 'b', 'c'])
>>> d
deque(['a', 'b', 'c'])
>>> d.append('d')
>>> d
deque(['a', 'b', 'c', 'd'])
>>> d.count('b')
1
>>> d.extend(['e', 'f', 'g'])
>>> d
deque(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
>>> d.pop()
'g'
>>> d
deque(['a', 'b', 'c', 'd', 'e', 'f'])
>>> d.remove('d')
>>> d
deque(['a', 'b', 'c', 'e', 'f'])
>>> d.reverse()
>>> d
deque(['f', 'e', 'c', 'b', 'a'])

# 队列左端操作
>>> d
deque(['f', 'e', 'c', 'b', 'a'])
>>> d.popleft()
'f'
>>> d
deque(['e', 'c', 'b', 'a'])
>>> d.appendleft('h')
>>> d
deque(['h', 'e', 'c', 'b', 'a'])
>>> d.extendleft(['i', 'j', 'k'])
>>> d
deque(['k', 'j', 'i', 'h', 'e', 'c', 'b', 'a'])
# 想想挖掘机的履带,rotate 就不难理解了
>>> d.rotate(1)
>>> d
deque(['a', 'k', 'j', 'i', 'h', 'e', 'c', 'b'])
>>> d.rotate(2)
>>> d
deque(['c', 'b', 'a', 'k', 'j', 'i', 'h', 'e'])

defaultdict

The biggest feature of defaultdict for me is that there will be no KeyError errors. We can go back to the list element statistics section to take a look.

List element statistics

Ordinary realization

>>> word_list = ["a", "b", "c", "c", "a", "a"]
>>> cnt = {}
>>> for word in word_list:
...     if word not in cnt:
...             cnt[word] = 1
...     else:
...             cnt[word] += 1
... 
>>> cnt
{'a': 3, 'b': 1, 'c': 2}

>>> cnt['d']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'd'

Defaultdict implementation (no if else statement is used to judge)

>>> from collections import defaultdict
>>> word_list = ["a", "b", "c", "c", "a", "a"]
>>> cnt = defaultdict(int)
>>> for word in word_list:
...     cnt[word] += 1
... 
>>> cnt
defaultdict(<class 'int'>, {'a': 3, 'b': 1, 'c': 2})

OrderedDict

Seeing, hearing, knowing, is an ordered dictionary, it seems that there is nothing particularly easy to explain.

>>> from collections import OrderedDict
>>> d = {"banana":3,"apple":2,"pear":1,"orange":4}
>>> order_dict = OrderedDict(d)
>>> order_dict
OrderedDict([('banana', 3), ('apple', 2), ('pear', 1), ('orange', 4)])
>>> order_dict.keys()
odict_keys(['banana', 'apple', 'pear', 'orange'])
>>> order_dict.values()
odict_values([3, 2, 1, 4])
>>> order_dict.items()
odict_items([('banana', 3), ('apple', 2), ('pear', 1), ('orange', 4)])

# 从后(前)删除元素
>>> order_dict.popitem(last=True)
('orange', 4)
>>> order_dict
OrderedDict([('banana', 3), ('apple', 2), ('pear', 1)])
>>> order_dict.popitem(last=False)
('banana', 3)
>>> order_dict
OrderedDict([('apple', 2), ('pear', 1)])

# 移动元素到末尾
>>> order_dict
OrderedDict([('apple', 2), ('pear', 1), ('orange', 4)])
>>> order_dict.move_to_end('apple')
>>> order_dict
OrderedDict([('pear', 1), ('orange', 4), ('apple', 2)])

 

Guess you like

Origin blog.csdn.net/TomorrowAndTuture/article/details/113850006