美文网首页测试之路
#Python#列表之 list 与 deque

#Python#列表之 list 与 deque

作者: 我叫GTD | 来源:发表于2018-05-06 23:09 被阅读43次

    提到列表,相信第一印象肯定会是list,而list确实也能解决大部分的需要,但碰到列表内的数据量相当大的时候,性能问题就显得尤为重要;再或者列表被恶意注入一个无穷大的数据量时,就可能会暴露出安全问题来。较好的替代方法是:collections.deque。获得性能或安全的同时,牺牲的是数据大小。
    下面是两者都存在的功能:

    # 创建
    a_list = [1, 2, 3, 4]
    
    from collections import deque
    b_deque = deque([1, 2, 3, 4])
    
    # 在列表末尾添加新的对象
    a_list.append(5)
    b_deque.append(5)
    
    # 统计某个元素在列表中出现的次数
    a_list.count(2)
    b_deque.count(2)
    
    # 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
    a_list.extend([6, 7, 8])
    b_deque.extend([6, 7, 8])
    
    # 从列表中找出某个值第一个匹配项的索引位置
    a_list.index(5)
    b_deque.index(5)
    
    # 将对象插入列表
    a_list.insert(3, 'x')
    b_deque.insert(3, 'x')
    
    # 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
    a_list.pop()
    b_deque.pop()
    
    # 移除列表中某个值的第一个匹配项
    a_list.remove('x')
    b_deque.remove('x')
    
    # 反向列表中元素
    a_list.reverse()
    b_deque.reverse()
    
    # 清空列表
    a_list.clear()
    b_deque.clear()
    
    # 复制列表
    a_list.copy()
    b_deque.copy()
    

    由此可见,在list中的所有功能几乎可以以同样的方式在deque里实现。但deque中不能使用sort方法来排序,可以以sorted(b_deque)来实现。
    下面是deque中特有的方法:

    from collections import deque
    b_deque = deque([4, 7, 1, 5, 8])
    
    # 从左侧移除列表中的一个元素,并且返回该元素的值
    b_deque.leftpop()
    
    # ---用list实现也不是不可,只不过有点麻烦~~~
    def leftpop(lists):
      x = lists[0]
      del lists[0]
      return x
    leftpop(a_list)
    
    # 在列表首端一次性追加另一个序列中的多个值
    b_deque.extendleft(['x', 'y'])
    
    # 限制deque的长度
    c_deque = deque([1, 2, 3, 4], maxlen=4)
    c_deque.append(5) # 此时会在末尾加入5,同时删除最前面的1。
    

    对于deque来说从队列两端添加或弹出元素的复杂度都是O(1)。而从列表的头部插入或移除元素时,列表的复杂度为O(N)。

    相关文章

      网友评论

        本文标题:#Python#列表之 list 与 deque

        本文链接:https://www.haomeiwen.com/subject/pjrprftx.html