一文了解 Python 中的 Collection 模块
Posted 宇宙之一粟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文了解 Python 中的 Collection 模块相关的知识,希望对你有一定的参考价值。
Collections 模块
本文将简单介绍一个 Python 模块 Collections 。这个模块实现了一些很好用的数据结构,可以帮助我们解决不同的实际问题。
这个模块实现了特定目标的容器,以提供Python标准内建容器 dict
, list
, set
, 和 tuple
的替代选择。
| 创建命名元组子类的工厂函数 |
| 类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop) |
| 类似字典(dict)的容器类,将多个映射集合到一个视图里面 |
| 字典的子类,提供了可哈希对象的计数功能 |
| 字典的子类,保存了他们被添加的顺序 |
| 字典的子类,提供了一个工厂函数,为字典查询提供一个默认值 |
| 封装了字典对象,简化了字典子类化 |
| 封装了列表对象,简化了列表子类化 |
| 封装了字符串对象,简化了字符串子类化 |
引入方法
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是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
>>> from collections 一文带你了解 Python 中的装饰器一文了解 Python 中的对象比较方法 is 和 == 及其本质