双端队列
对于其提供的各种方法,可以理解为是一个”列表“
- 入队默认在右端,出队默认在左端
- 在右侧的尾端入队:
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
即可判断队列是否为空- 更多操作:
count
、index
、copy
、reverse
、rotate
轮转,clear
、appendleft
、pop
、extendleft
- 创建时可用
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)
拼接两个字典