Python学习笔记——collections标准库(双端队列、计数器、默认字典、有序字典)

双端队列

对于其提供的各种方法,可以理解为是一个”列表“

  • 入队默认在右端,出队默认在左端
  • 在右侧的尾端入队:append(),在尾端出队:pop()
  • 在左侧的队首出队:popleft(),在队首入队:appendleft()
import collections
dq = collections.deque('abcdef')#双端队列,支持用下标访问,如dq[0]='a'

deque的用法:入队默认在右端,出队默认在左端

  • deque.append()将一个对象从右端入队
  • deque.extend()直接将可迭代对象中的元素分别入队
    例如search_queue.extend([‘b’, ‘c’, ‘d’])
    也可以用+操作符实现等价操作,如search_queue += [‘b’, ‘c’, ‘d’]
  • deque.popleft()从左端出队
  • 注意,没有empty方法,直接用if search_queue即可判断队列是否为空
  • 更多操作:countindexcopyreverserotate轮转,clearappendleftpopextendleft
  • 创建时可用collections.deque(maxlen=5)指定最大长度,当入队时超出长度,则另一侧元素自动出队

由于deque.extend可以将可迭代对象的所有元素入队,BFS中如果邻居结点用列表保存,可以搭配deque(而非queue.Queue),方便地将一个结点的所有邻居结点入队

计数器

import collections
cnt = collections.Counter('aaabbc')
================== RESTART: C:\Users\13272\Desktop\tst.py =================
>>> cnt
Counter({'a': 3, 'b': 2, 'c': 1})

也可先构造空的Count,然后用update()方法不断更新

import collections
cnt = collections.Counter()
================== RESTART: C:\Users\13272\Desktop\tst.py =================
>>> cnt.update('aaa')
>>> cnt
Counter({'a': 3})
>>> cnt.update('bbc')
>>> cnt
Counter({'a': 3, 'b': 2, 'c': 1})

Counter常用方法(可以将Counter看作字典,直接迭代Counter相当于迭代其所有key值)

#Counter类似字典
>>> for key in cnt:
	print(key,cnt[key])

	
a 3
b 2
c 1
#elements()返回包含所有元素的迭代器
>>> list(cnt.elements())
['a', 'a', 'a', 'b', 'b', 'c']

#most_common(n)返回计数结果最多的前n个元素
>>> for letter, count in cnt.most_common(2):
    print (letter, count)

    
a 3
b 2

另外,Counter支持+-&|操作符(类似集合)

>>> c1 = collections.Counter('aaabbc')
>>> c2 = collections.Counter('aab')
>>> c1
Counter({'a': 3, 'b': 2, 'c': 1})
c
>>> c2
Counter({'a': 2, 'b': 1})
#各项计数结果相叠加
>>> c1+c2
Counter({'a': 5, 'b': 3, 'c': 1})
#各项计数结果相减
>>> c1-c2
Counter({'a': 1, 'b': 1, 'c': 1})
>>> c2-c1
Counter()
#交集(公共项中,取计数最小的那些)
>>> c1&c2
Counter({'a': 2, 'b': 1})
#并集(两相同项,取计数值更大的)
>>> c1|c2
Counter({'a': 3, 'b': 2, 'c': 1})

默认字典

dict的方法dict.setdefault(key, default=None)当要查询的key不存在时,向字典新增一个值为default的键key

默认字典defaultdict则当访问到不存在的key时,自动为其设置默认值

import collections
d = collections.defaultdict(lambda :'default value')
#也可传入str、int、list等函数,则默认值为''、0、[]等
================== RESTART: C:\Users\13272\Desktop\最大公约数gcd.py =================
>>> d[10]
'default value'

有序字典

有序字典OrderedDict是字典子类,保存插入顺序

import collections
d = collections.OrderedDict()
================== RESTART: C:\Users\13272\Desktop\最大公约数gcd.py =================
>>> d[1]='a'
>>> d[2]='b'
>>> d[3]='c'
>>> for k,v in d.items():
	print(k,v)

	
1 a
2 b
3 c

注意,从Python 3.6开始,普通字典dict也保证插入顺序不变,“dict就是OrderedDict”
要将一个元素移动到字典的末尾,pop删除后重新插入即可
要将一个元素移动到字典的开头,pop后,单独创建一个仅含一个键值对的字典,然后用dict1.update(dict2)拼接两个字典

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值