#Python#列表之 list 与 deque
2018-05-06 本文已影响43人
我叫GTD
提到列表,相信第一印象肯定会是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)。