zoukankan      html  css  js  c++  java
  • python模块--collections

    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')])
  • 相关阅读:
    JAVA常用知识总结(十一)——数据库(一)
    JAVA常用知识总结(十)——Maven
    JAVA常用知识总结(九)——线程
    JAVA常用知识总结(八)——计算机网络
    JAVA常用知识总结(七)——Spring
    Spring Cloud Alibaba教程:Nacos
    OpenCV入门(2)- Java第一个程序
    OpenCV入门(1)- 简介
    Elastic Job入门(1)
    Elastic Job入门(3)
  • 原文地址:https://www.cnblogs.com/thomson-fred/p/10093934.html
Copyright © 2011-2022 走看看