2014-11-06 52 views
-1

我在Python網站上發現了這個。刪除並插入元素以開始列表是否有效?

另外,也可以使用一個列表作爲隊列,其中加入的第一元件 是檢索的第一元素(「先入先出」);但是, 列表不適用於此目的。雖然從 追加和彈出列表的末尾的速度快,這樣做從01​​開始插入或彈出的列表是很慢(因爲所有其他元素都必須通過一個移位 )

這是OK但我的問題是,刪除或插入元素到列表的開頭是否有效?

+4

你的報價已經包含答案:「從列表開始做插入或者彈出是慢的」(一個'pop'是一個'remove',它返回被移除的項目)。 – hildensia 2014-11-06 12:25:09

+1

在您的文檔中有部分尚未回答問題? – 2014-11-06 12:25:17

回答

1

正如評論者所指出的那樣,您從文檔中引用的引用明確表示它效率不高。

如果你想要一個有效的雙端隊列結構,你應該使用deque

1

與文檔中所述的一樣,當您從列表的開頭插入或移除元素時,所有其他元素都必須移位,因此對列表大小進行O(n)操作。

但請注意,Python使用引用語義,並且列表的確僅包含指針指向元素,因此只執行指針移動而不移動整個對象。因此,在操作O(n)時,該常數非常小。

例如,在C++中,使用「值語義」代替std::vector(與Python列表最相似的容器)包含對象本身和切換元素,操作更復雜,甚至可能需要複製大量數據少數元素(如果它們很大)。

1

集合模塊中有一個專門設計的容器deque,它在兩端更有效地插入和彈出元素。它在其他方面使用與列表相同的方法,所以實現一個隊列對象應該保持不變,不帶任何副作用,除了使用deque而不是列表。

+1

'deque'操作在開始時*效率更高,*效率更低*。否則就不需要其他任何東西。 – Borodin 2014-11-06 12:37:09