python之collections

collections是日常工作中的重点、高频模块,包含了一些特殊的容器,针对Python内置的容器,例如list、dict、set和tuple,常用类型有:

namedtuple,可以创建包含名称的tuple;

deque,双边队列,类似于list的容器,可以快速的在队列头部和尾部添加、删除元素;

Counter,dict的子类,计算可hash的对象;

OrderedDict,dict的子类,可以记住元素的添加顺序;

defaultdict,dict的子类,可以调用提供默认值的函数;

default_factory

默认字典,字典的一个子类,继承所有字典的方法,默认字典在进行定义初始化的时候得指定字典值有默认类型。
Python中通过Key访问字典,当Key不存在时,会引发‘KeyError’异常。通过使用collections类中的defaultdict()方法可以为字典提供默认值。

语法格式:
collections.defaultdict([default_factory[, …]])

1.第一个参数为default_factory属性提供初始值,默认为None;其余参数包括关键字参数(keyword arguments)的用法,和dict构造器用法一样。

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)
a=sorted(d.items())
print(a)

output
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

2.defaultdict还可以被用来计数,将default_factory设为int即可。default_factory函数调用int()为其提供一个默认值0,加法操作将计算出每个字母出现的次数。

函数int()是常值函数的一种特例,总是返回0

from collections import defaultdict
s = 'okokokokooooooooollll'
d = defaultdict(int)
for k in s:
    d[k] += 1
print(d)
a=sorted(d.items())
print(a)

output:
defaultdict(<class 'int'>, {'o': 13, 'k': 4, 'l': 4})
[('k', 4), ('l', 4), ('o', 13)]

3.defaultdict它重写了方法 missing(key),增加了一个可写的实例变量default_factory,实例变量default_factory被missing()方法使用,如果该变量存在,则用以初始化构造器,如果没有,则为None。其它的功能和dict一样。使用匿名函数(lambda function)可以更快、更灵活的创建常值函数,返回任意常数值

from collections import defaultdict
def constant_factory(value):
    return lambda: value
d = defaultdict(constant_factory('<missing_flag_test>'))
print('\n',d)
d.update(name='Hensel', action='left')
print('\n',d)
print('\n','%(name)s %(action)s to %(object)s' % d)

output:
 defaultdict(<function constant_factory.<locals>.<lambda> at 0x7f830baf5598>, {})

 defaultdict(<function constant_factory.<locals>.<lambda> at 0x7f830baf5598>, {'name': 'Hensel', 'action': 'left'})

 Hensel left to <missing_flag_test>

4.default_factory设为set时,可以用defaultdict建立集合字典(a dictionary of sets)。

from collections import defaultdict
s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = defaultdict(set)
for k, v in s:
    d[k].add(v)
print(d)
a=sorted(d.items())
print(a)

output:
defaultdict(<class 'set'>, {'red': {1, 3}, 'blue': {2, 4}})
[('blue', {2, 4}), ('red', {1, 3})]

deque

deque是双端队列(double-ended queue)的缩写,由于两端都能编辑,deque既可以用来实现栈(stack)也可以用来实现队列(queue)。
相比于list实现的队列,deque实现拥有更低的时间和空间复杂度。list实现在出队(pop)和插入(insert)时的空间复杂度大约为O(n),deque在出队(pop)和入队(append)时的时间复杂度是O(1)。
常用方法:

func作用
append追加元素到队列
appendleft队列左边添加元素
clear清空队列中的所有元素
count返回队列中包含value的个数
extend队列右边扩展,可以是列表、元组或字典,如果是字典则将字典的key加入到deque
extendleft同extend,在左边扩展
pop移除并返回队列右边的元素
popleft移除并返回队列左边的元素
remove(value)移除队列第一个出现的元素
reverse队列的所有元素进行反转
rotate(n)对队列数进行移动

在这里插入图片描述
deque也支持in操作符,可以使用如下写法:

q = collections.deque([1, 2, 3, 4])
print(5 in q)  # False
print(1 in q)  # True

deque还封装了顺逆时针的旋转的方法:rotate


# 顺时针
q = collections.deque([1, 2, 3, 4])
q.rotate(1)
print(q)  # [4, 1, 2, 3]
q.rotate(1)
print(q)  # [3, 4, 1, 2]

# 逆时针
q = collections.deque([1, 2, 3, 4])
q.rotate(-1)
print(q)  # [2, 3, 4, 1]
q.rotate(-1)
print(q)  # [3, 4, 1, 2]

参考
https://www.jianshu.com/p/47f66ff4ab7b
https://www.cnblogs.com/xiaobingqianrui/p/8483118.html
https://blog.csdn.net/yangsong95/article/details/82319675
https://www.cnblogs.com/lincappu/p/12890765.html
https://www.cnblogs.com/volcao/p/8728102.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值