Python每日一練0004

問題

如何保存迭代對象的最後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每日一練

相關文章
相關標籤/搜索