为什么Python的列表没有shift / unshift方法?

时间:2015-12-10 20:18:31

标签: python list

我想知道为什么Python中的默认list没有任何shiftunshift方法。也许有一个明显的原因,就像列表在内存中的排序方式一样。

目前,我知道我可以使用append在列表末尾添加项目并删除以删除元素。但是,我只能使用列表连接来模仿缺少shiftunshift方法的行为。

>>>a = [1,2,3,4,5]

>>>a.append(6)
>>>a
[1,2,3,4,5,6]

>>>a.pop()
[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]

我错过了什么吗?

2 个答案:

答案 0 :(得分:23)

Python列表针对快速固定长度操作进行了优化,并导致pop(0)insert(0, v)操作的O(n)内存移动成本,这些操作会更改基础数据表示的大小和位置。实际上,"列表" CPython中的数据类型与许多其他语言可能称之为列表(例如链接列表)的工作方式不同 - 它的实现方式与其他语言可能称为数组的方式类似,尽管这里存在一些差异太

您可能感兴趣的是collections.deque,这是一个类似列表的容器,两端都有快速追加和弹出。

Deques支持线程安全,内存有效的追加和双端队列的弹出,在任一方向上具有大致相同的O(1)性能。您似乎要询问的遗漏方法在名称appendleftpopleft下提供:

appendleft(x)
Add x to the left side of the deque.

popleft()
Remove and return an element from the left side of the deque. 
If no elements are present, raises an IndexError.

当然有一个权衡,在deque的中间附近的索引或插入/删除很慢。实际上deque.insert(index, object)甚至不可能before Python 3.5,您需要旋转,插入/弹出和旋转。你也失去了切片,所以如果你需要它,你将不得不写一些烦人的东西,例如而是itertools.islice

有关dequelist数据结构的优缺点的进一步讨论,请参阅How are deques in Python implemented, and when are they worse than lists?

答案 1 :(得分:-1)

在Python3中

我们在列表上有插入方法。 接受您需要添加的值以及要添加它的索引。

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