python collections模块

collections是Python内建的一个集合模块,提供了许多有用的集合类。

对象(函数) 说明
Counter 提供快速及方便的计数器的dict子类
deque 双向队列
defaultdict 为缺失值提供默认值的dict子类
namedtuple() 用于创建具有字段的元组子类的工厂函数
OrderedDict 使字典的key保持有序的字典子类

:由于python3.7已经支持dict类型的有序,故这里就不再介绍OrderedDict,需要的可以参考官方文档

Counter对象

class collections.Counter([iterable-or-mapping])

  • 作用:统计iterable(可迭代对象)或mapping(映射对象)中元素出现的次数

Counter对象的初始化,如下

from collections import Counter
c = Counter()  # 空的Counter对象
c = Counter('demo_string')  # 从iterable中初始化Counter对象
c = Counter({'a': 2, 'b': 5})  # 从mapping中初始化Counter对象
c = Counter(a=2, b=5)  # 使用键值对初始化Counter对象
string = 'pythonnohtyp'
c = Counter(string)
# Counter({'p': 2, 'y': 2, 't': 2, 'h': 2, 'o': 2, 'n': 2})

:Counter对象的值可正,可负或为0;即Counter(a=-1, b=0, c=1)

Counter对象继承了字典的大部分方法(除了update,fromkeys),同时添加了一些其他的方法

Counter.elements()

  • 作用:返回一个迭代器,迭代器里的内容是Counter对象的值大于0 的元素,元素出现的次数与元素统计的值相等。
c = Counter(a=1, b=5, c=0, d=-1)
l = list(c.elements())
l # ['a', 'b', 'b', 'b', 'b', 'b']

Counter.most_common([n])

  • 作用:返回一个元素类型是元组的列表,元素元组对应Counter对象的key和value,同时,按照value从大到小排序
  • 参数 n:可选,列表的长度,若不指定,则显示全部
c = Counter(a=1, b=5, c=0, d=-1)
c.most_common()
# [('b', 5), ('a', 1), ('c', 0), ('d', -1)]
c.most_common(0)
# []
c.most_common(2)
# [('b', 5), ('a', 1)]

Counter.subtract([iterable-or-mapping])

  • 作用:用Counter对象减去iterable或mapping对象的元素,两者的元素个数不要求相等,改变原Counter对象
c = Counter(a=0, b=2, c=-1)
d = Counter(a=2,d=3)
l = ['a', 'b', 'c']
c.subtract(d)
print(c)
# Counter({'b': 2, 'c': -1, 'a': -2, 'd': -3})
c.subtract(l)
print(c)
# Counter({'b': 1, 'c': -2, 'a': -3, 'd': -3})

说明
Counter对象继承了字典的大部分方法,但是Counter对象没有fromkeys()方法;
而update([iterable-or-mapping])方法与原字典的update不同,前者是将iterable或mapping对象加上,不会替换已有值,可近似看成subtract()的反操作。

数学操作
c1 = Counter(a=3, b=1)
c2 = Counter(a=1, b=4)
c1 + c2
# Counter({'b': 5, 'a': 4})
c1 - c2
# Counter({'a': 2})
c1 & c2
# Counter({'a': 1, 'b': 1})
c1 | c2
# Counter({'b': 4, 'a': 3})

deque对象

class collections.deque([iterable[,maxlen]])

  • 作用:创建一个长度为maxlen初始值为iterable的双向队列
  • 参数:
    - iterable:可选,队列初始值,若不指定,则为空队列
    - maxlen:可选,队列的最大长度,若不指定,则为任意长度
    :指定了maxlen参数,当队列达到最大长度时,再加入新项,则会从另一端弹出相同数量的项
from collections import deque
dq = deque([1, 2, 3], maxlen=6)
print(dq)
# deque([1, 2, 3], maxlen=6)
方法

deque.append(x):从队列deque的右端加入元素x
deque.appendleft(x):从队列deque的左端加入元素x

deque.extend(iterable):从队列deque的右端依次添加iterable中的元素
deque.extendleft(iterable):从队列deque的左端依次添加iterable中的元素

deque.pop():移除队列deque最右端的元素,并返回该元素,若deque为空,则抛出IndexError。
deque.popleft():移除队列deque最左端的元素,并返回该元素,若deque为空,则抛出IndexError。

demo_dq = deque([1, 2, 3, 4, 5, 6])
demo_list = [99, 98, 97]
demo_dq.append(55)
# deque([1, 2, 3, 4, 5, 6, 55])
demo_dq.appendleft(66)
# deque([66, 1, 2, 3, 4, 5, 6, 55])
demo_dq.extend(demo_list)
# deque([66, 1, 2, 3, 4, 5, 6, 55, 99, 98, 97])
demo_dq.extendleft(demo_list)
# deque([97, 98, 99, 66, 1, 2, 3, 4, 5, 6, 55, 99, 98, 97])
demo_dq.pop()
# 97
demo_dq.popleft()
# 97
print(demo_dq)
# deque([98, 99, 66, 1, 2, 3, 4, 5, 6, 55, 99, 98])

deque.copy():对deque队列进行浅拷贝,返回一个新的deque实例对象
deque.clear():清空deque队列的内容
deque.count(x):计算deque队列中元素x的个数
deque.index(x[, start[, stop]]):从位置start开始到位置stop,找到第一个匹配元素x的位置。参数start,stop为可选
deque.insert(i, x):在deque队列的位置i,插入元素x
deque.remove(value):移除队列deque中的元素value,若无队列中无value,则抛出ValueError
deque.reverse():对队列deque进行逆序排序
deque.rotato(n=1):对队列deque向右循环移动 n 步,n为负数时,则向左循环移动。n为 1 时,等价于deque.extendleft(deque.pop());n为 -1 时,等价于deque.extend(deque.popeleft())

demo_dq = deque(['a', 'a', 'b', 'c'])
copy_dq = demo_dq.copy()
copy_dq
# deque(['a', 'a', 'b', 'c'])
copy_dq.clear()
copy_dq
# deque([])
demo_dq.count('a')
# 2
demo_dq.index('b')
# 2
demo_dq.insert(4,'ab')
demo_dq
# deque(['a', 'a', 'b', 'c', 'ab'])
demo_dq.remove('aa')
# Traceback (most recent call last):
#   File "", line 1, in 
#     demo_dq.remove('aa')
# ValueError: deque.remove(x): x not in deque
demo_dq.reverse()
demo_dq
# deque(['ab', 'c', 'b', 'a', 'a'])
demo_dq.rotato(2)
# deque(['a', 'a', 'ab', 'c', 'b'])

defaultdict对象

class collections.defaultdict([default_factory[,…]])

  • 作用:是内置dict的子类,基本功能与dict相同,不同defaultdict可以设置key的初始值,使得当访问defaultdict时,如果不存在key,不会直接报错。
  • 参数 default_factory:初始值设置的工厂函数,如int, list等,也可自己通过lambda函数创建函数
from collections import defaultdict
dd = defaultdict(int, [('name', 'Mike'), ('gender', 'male')])
dd
# defaultdict(, {'name': 'Mike', 'gender': 'male'})
dd['age']
# 0
dd
# defaultdict(, {'name': 'Mike', 'gender': 'male', 'age': 0})
dd1 = defaultdict(lambda:'N/A')
dd1['a'] = 'AA'
dd1['a']
# 'AA'
dd1['c']
# 'N/A'

namedtuple() – 命名元组工厂函数

collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)

  • 创建一个名为typename 的元组子类,同时可以通过参数field_names为该元组设置字段名。(或者这样理解:用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。)
  • 参数:
    - typename: 元组名
    - field_names:字段名,可以为如[‘x’, ‘y’]的列表形式,也可以是如 'x y’或’x,y’的纯字符,字段名的命名规则与变量的命名规则相同,即由字母,数字,下划线组成,但首字母不能是数字或下划线,另外不能是关键字。
    - rename: 是否将field_names中的无效命名自动重置
    - defaults:对应字段的默认值
    - module: 模块名,如果有定义,则可通过__module__属性获取它的值
from collections import namedtuple
Person = namedtuple('P', 'name, age, job', defaults=['Mike', 21, 'Student'])
p1 = Person()
p1
# P(name='Mike', age=21, job='Student')
p2 = Person('Hajo', 20, 'Student')
p2
# P(name='Hajo', age=20, job='Student')

namedtuple继承了元组的方法,collections模块额外添加了三个方法和两个属性

方法(method)

somenamedtuple._make(iterable):从存在的iterable对象中创建新的namedtuple实例,iterable对象的元素个数需与somenamedtuple类中的field_names的个数相等

somenamedtuple._asdict():将实例化对象somenamedtuple转换为OrderedDict类型,
:版本python3.8,则转换为dict类型.

somenamedtuple._replace(**kwargs):将指定的字段的值替换成新的值,返回一个新的实例

from collections import namedtupel
Person = namedtuple('P', 'name, age, job', defaults=['Mike', 21, 'Student'])
p_list = ['Shanel', 21, 'Student']
p1 = Person._make(p_list)
p1
# P(name='Shanel', age=21, job='Student')
p1._asdict()
# OrderedDict([('name', 'Shanel'), ('age', 21), ('job', 'Student')])
p1._replace(name='John')
# P(name='John', age=21, job='Student')

属性(attributes)

somenamedtuple._fields:以元组形式列出field_names
somenamedtuple._fields_defaults:以字典形式列出默认值(defaults),若没有设置默认值,则无该属性.

Person = namedtuple('P', 'name, age, job', defaults=['Mike', 21, 'Student'])
Person._fields
# 
Person._fields_defaults
# {'name': 'Mike', 'age': 21, 'job': 'Student'}

笔者水平有限,有错欢迎评论留下,谢谢!!
需要了解更多collections模块的内容可以参考官方文档

你可能感兴趣的:(python标准库,python)