如何保存迭代對象的最後N個元素python
例如保存列表['a', 'b', 'c', 'd']
的最後2個元素微信
或者保存某個迭代器對象的最後5個元素數據結構
對於列表、元組這樣的數據結構,能夠使用切片來很方便的實現,例如保存列表l
的最後3個元素就能夠直接l[-3:]
spa
但有些時候,咱們操做的可迭代對象不能使用切片code
這個時候能夠使用collections
庫裏的deque
(雙端隊列)數據結構對象
from collections import deque def foo(): for i in range(100): yield i last_5 = list(deque(foo(), maxlen=5)) print(last_5)
deque能作到這一點,是由於若是deque指定了maxlen,那麼當deque的元素超過maxlen時,就會從另外一端把端頭的元素刪掉,再插入新的元素隊列
也就是說,當deque指定了maxlen,deque中的元素永遠最多隻有maxlen個rem
這裏雖然也能夠使用list
來模擬出這種效果,但並不能使用list
,緣由是由於list若是刪除頭部的元素,時間複雜度會是O(n),而deque刪除頭部和尾部元素的時間複雜度都是O(1)it
deque
是一個相似於list
的數據結構,但又與list
有許多不一樣之處,這裏詳細介紹一下io
deque
對象時,若是不指定maxlen
,那麼deque
的元素個數會不斷增長;若是指定了maxlen
,那麼當元素的個數超過maxlen
時再插入,就會先刪掉另外一端隊頭的元素,而後再插入新的元素deque
也支持下標訪問,訪問兩端的隊頭元素時,時間複雜度爲O(1),但訪問中間的元素時,時間複雜度會退化到O(n)。這一點與list
不一樣,list
隨機訪問任意一個位置的元素時間複雜度都是O(1)deque
刪除兩端元素的複雜度都是O(1);而list
刪除最後一個元素的複雜度是O(1),刪除第一個元素的複雜度是O(n),這是由於後面的元素須要向前移位Python Cookbook
歡迎關注個人微信公衆號:python每日一練