簡體   English   中英

為什么 Python 的列表沒有 shift/unshift 方法?

[英]Why Python's list does not have shift/unshift methods?

我想知道為什么 Python 中的默認list沒有任何shiftunshift方法。 也許有一個明顯的原因,比如列表在內存中的排序方式。

所以目前,我知道我可以使用append在列表的末尾添加一個項目,並使用pop從末尾刪除一個元素。 但是,我只能使用列表連接來模仿缺少shiftunshift方法的行為。

>>> a = [1,2,3,4,5]
>>> a = [0] + a  # Unshift / Push
>>> a
[0,1,2,3,4,5]
>>> a = a[1:]  # Shift / UnPush
>>> a
[1,2,3,4,5]

我錯過了什么?

Python 列表針對快速固定長度操作進行了優化,並且會為pop(0)insert(0, v)操作帶來 O(n) 內存移動成本,這會改變底層數據表示的大小和位置。 實際上,CPython 中的“列表”數據類型與許多其他語言可能稱之為列表(例如鏈表)的工作方式不同 - 它的實現與其他語言可能稱之為數組的內容更相似,盡管這里也有一些差異.

您可能對collections.deque感興趣,它是一個類似列表的容器,兩端都有快速追加和彈出。

雙端隊列支持線程安全、內存高效的追加和從雙端隊列的任一側彈出,在任一方向上的 O(1) 性能大致相同。

您似乎在詢問的缺失方法在名稱appendleftpopleft下提供:

追加左( x )

將 x 添加到雙端隊列的左側。

彈出左鍵()

從雙端隊列的左側移除並返回一個元素。 如果不存在元素,則引發 IndexError。

當然有一個權衡,在雙端隊列中間附近建立索引或插入/刪除很慢。 事實上deque.insert(index, object)在 Python 3.5 之前甚至是不可能的,你需要旋轉、插入/彈出和旋轉回來。 你也失去了切片,所以如果你需要,你必須寫一些煩人的東西,例如itertools.islice

要進一步討論dequelist數據結構的優缺點,請參閱Python 中deque是如何實現的,它們何時比列表更糟糕?

在 Python3 中

我們在列表上有插入方法。 獲取您需要添加的值以及要添加它的索引。

arrayOrList  = [1,2,3,4,5]
arrayOrList.insert(0 , 0) 
print(arrayOrList)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM