一文了解 Python 中的 Collection 模块

盛年不重来,一日难再晨,及时当勉励,岁月不待人。这篇文章主要讲述一文了解 Python 中的 Collection 模块相关的知识,希望能为你提供帮助。

Collections 模块本文将简单介绍一个 python 模块 Collections 。这个模块实现了一些很好用的数据结构,可以帮助我们解决不同的实际问题。
这个模块实现了特定目标的容器,以提供Python标准内建容器  ??dict??  ,  ??list??  ,  ??set??  , 和  ??tuple?  的替代选择。

???namedtuple()???
创建命名元组子类的工厂函数
???deque???
类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)
???ChainMap???
类似字典(dict)的容器类,将多个映射集合到一个视图里面
???Counter???
字典的子类,提供了可哈希对象的计数功能
???OrderedDict???
字典的子类,保存了他们被添加的顺序
???defaultdict???
字典的子类,提供了一个工厂函数,为字典查询提供一个默认值
???UserDict???
封装了字典对象,简化了字典子类化
???UserList???
封装了列表对象,简化了列表子类化
???UserString???
封装了字符串对象,简化了字符串子类化
引入方法
import collections

可以通过??import collections???导入该模块的方法,现在我们进入 ipython3 然后使用??dir(collections)??查看collections下都有哪些可以用的类。
In [1]: import collections

In [2]: dir(collections)
Out[2]:
[ChainMap,
Counter,
OrderedDict,
UserDict,
UserList,
UserString,
_Link,
_OrderedDictItemsView,
_OrderedDictKeysView,
_OrderedDictValuesView,
__all__,
__builtins__,
__cached__,
__doc__,
__file__,
__getattr__,
__loader__,
__name__,
__package__,
__path__,
__spec__,
_chain,
_collections_abc,
_count_elements,
_eq,
_heapq,
_iskeyword,
_itemgetter,
_nt_itemgetters,
_proxy,
_recursive_repr,
_repeat,
_starmap,
_sys,
abc,
defaultdict,
deque,
namedtuple]



根据官方文档: 这个模块实现了特定目标的容器,以提供Python标准内建容器 ??dict??? , ??list??? , ??set??? , 和 ??tuple?? 的替代选择。


Counter
Counter是一个dict子类,可帮助计算可哈希对象的值。在其中,元素存储为字典的键,值可以为零或负值。它是一个集合,元素像字典键(key)一样存储,它们的计数存储为值。计数可以是任何整数值,包括0和负数。 Counter 类有点像其他语言中的 bags或multisets。
在下例中,我们可以找到文件单词出现的次数:
from collections import Counter
sentence = "I can because i think i can"
# Counter是一个简单的计数器,可以数组中统计字符出现的个数:
counts = Counter(sentence.split())
print(counts)# Counter(can: 2, i: 2, I: 1, because: 1, think: 1)

Counter对象有一个??elements??的方法,该方法在元素上返回迭代次数超过元素计数的迭代器。元素以任意顺序返回。
In [7]: c = Counter(a=4, b=2, c=0, d=-2)

In [8]: list(c.elements())
Out[8]: [a, a, a, a, b, b]

??most_common??是一种返回最常见元素及其计数(从最常见到最小)的方法。
In [9]: Counter(this is a test sentence).most_common(3)
Out[9]: [(t, 4), (s, 4), ( , 4)]

Counter对象有一个字典接口,如果引用的键没有任何记录,就返回一个0,而不是弹出一个  ??KeyError?  :
> > > c = Counter([eggs, ham])
> > > c[bacon]# count of a missing element is zero
0

设置一个计数为0不会从计数器中移去一个元素。使用  del  来删除它:
> > > c[sausage] = 0# counter entry with a zero count
> > > del c[sausage]# del actually removes the entry

defaultdict
defaultdict是类似于字典的对象,它提供字典提供的所有方法,但将第一个参数(default_factory)作为字典的默认数据类型。使用defaultdict比使用dict.set_default方法执行相同操作更快。
> > > from collections import defaultdict
> > > s = [(yellow, 1), (blue, 2), (yellow, 3), (blue, 4), (red, 1)]
> > > d = defaultdict(list)
> > > for k, v in s:
...d[k].append(v)
...
> > > d.items()
dict_items([(blue, [2, 4]), (red, [1]), (yellow, [1, 3])])

在该示例中,即使defaultdict对象中没有键,您也可以看到它会自动创建一个空列表。list.append然后有助于将值附加到列表中。
使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
> > > from collections import defaultdict
> > > dd = defaultdict(lambda: N/A)
> > > dd[key1] = abc
> > > dd[key1] # key1存在
abc
> > > dd[key2] # key2不存在,返回默认值
N/A

nametuple
命名元组有助于了解元组中每个位置的含义,并允许我们以更好的可读性和自记录代码进行编码。您可以在使用元组的任何地方使用它们。在示例中,我们将创建一个命名元组以显示点的保留信息。
> > > from collections import namedtuple
> > > Point = namedtuple(Point, [x, y])# Defining the namedtuple
> > > p = Point(10, y=20)# Creating an object
> > > p
Point(x=10, y=20)
> > > p.x + p.y
30
> > > p[0] + p[1]# Accessing the values in normal way
30
> > > x, y = p# Unpacking the tuple
> > > x
10
> > > y
20

deque
deque就是我们数据结构中听说的双端队列,Python已经帮我实现了这个功能。
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
【一文了解 Python 中的 Collection 模块】deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
> > > from collections

    推荐阅读