python的内建模块collections有几个关键的数据结构,平常在使用的时候,开发者可以直接调用,不需要自己重复制造轮子,这样可以提高开发效率。
1. deque双端队列
平常我们使用的python内置list类的append,extend,pop方法都是从list的尾部执行的(pop()默认弹出最后一个元素)。在使用的时候,list很像是一种栈结构(LIFO)。不同的是list灵活性更强,在栈的基础上有动态插入的方法,即insert(index,obj)和索引、切片等操作。强大的list似乎也可以实现队列(FIFO),但由于它实在太灵活了,列表中的元素极容易改变,在使用时令人总是不那么放心。为了实现更好的队列结构,一般程序员会自己实现一个类。
collections模块中为我们提供的双端队列是在队列的基础上实现头尾两端可append、可pop。另外还有insert,rotate等方法,也是相当灵活的
关键方法:
append() #从右端添加元素(与list同)
appendleft() #从左端添加元素(与list同)
extend() #从右端逐个添加可迭代对象(与list同)
extendleft() #从左端逐个添加可迭代对象(与list同)
pop() #从右端弹出元素(与list同)
popleft() #从左端弹出数据
count() #统计队列中的元素个数(与list同)
insert(index,obj) #在指定位置插入元素(与list同)
rotate() #旋转队列
基本使用例子:
from collections import deque d = deque() #增加数据 d.append(\'1\') d.append(\'2\') d.appendleft(\'3\') l = [\'4\',\'5\'] d.extend(l) d.extendleft(l) print(d) #计算deque元素个数 print(d.count(\'5\')) #循环移动 d.rotate(1) print(d) d.rotate(-1) print(d)
#计算股票和仓库存货常用的移动平均数
from collections import deque import itertools def moving_average(iterable,n=3): it = iter(iterable) d = deque(itertools.islice(it,n-1)) #迭代出前2个数据 print(d) d.appendleft(0) #防止第一次运行算法时候把第一个数据删除 s = sum(d) print(d) print(s) for elem in it: s += elem-d.popleft() d.append(elem) yield s/float(n) l = [10,20,18,27,15] for average in moving_average(l): print(average)
2. defaultdict 默认字典
我们平常在使用python内置的dict的时候,根据键key去查询对应的value值,如果不存在对应的key,会报错(KeyError)。但是在defaultdict就会会出现这个问题。
例子:
dd = defaultdict(lambda:\"none\") #只需要在定义的时候为不存在的key定义指定的显示值 dd[\"a\"] = \"apple\" dd[\"b\"] = \"banana\" print(dd[\"c\"]) print(dd) 结果: >>>none >>>defaultdict(<function <lambda> at 0x0000023B1C1919D8>, {\'c\': \'none\', \'a\': \'apple\', \'b\': \'banana\'})
由第二条的结果可以看出,defaultdict将不存在的键专门用一个字典来存放,而存在的键存放在另外一个字典中。当需要查询元素时,如果遇到没有的键key,就会获取第一字典中预先设定好的显示值。
3. OrderDict 有序字典
在使用python内置的dict时,用print()打印出整个字典,会发现前后两次字典的键值对顺序是不一样的(笔者猜测是前后两次的hash值不一样的缘故)。而在有序字典OderDict中,这种现象不会在发生。
例子:
od = OrderedDict() od[\"1\"] = \"one\" od[\"2\"] = \"two\" od[\"3\"] = \"three\" od[\"4\"] = \"four\" od[\"5\"] = \"five\" 结果: OrderedDict([(\'1\', \'one\'), (\'2\', \'two\'), (\'3\', \'three\'), (\'4\', \'four\'), (\'5\', \'five\')])
继续阅读与本文标签相同的文章
fast-spring-boot
-
看我Git 72变,GitHub发布4已超过8000星
2026-05-19栏目: 教程
-
深入MongoDB4.2新特性:字段级加密 Client-Side Field Level Encryption
2026-05-19栏目: 教程
-
日志服务数据加工最佳实践: 字符串动态键值对的提取
2026-05-19栏目: 教程
-
日志服务数据加工最佳实践: 从其他logstore拉取数据做富化
2026-05-19栏目: 教程
-
SpringBoot2 整合 FastDFS 中间件,实现文件分布式管理
2026-05-19栏目: 教程
