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')])
更多Python相关信息见Python 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=17
Linux公社的RSS地点:https://www.linuxidc.com/rssFeed.aspx