我想知道为什么Python语言中的默认list
没有任何shift
、unshift
方法。也许有一个显而易见的原因,比如列表在内存中的排序方式。
所以目前,我知道我可以使用append
在列表的末尾添加一个项目,使用pop
从列表的末尾删除一个元素。但是,我只能使用列表连接来模拟缺少的shift
或unshift
方法的行为。
>>> 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]
我错过了什么吗?
发布于 2015-12-11 04:50:49
Python list针对快速的固定长度操作进行了优化,并为pop(0)
和insert(0, v)
操作带来了O(n)的内存移动成本,这些操作改变了底层数据表示的大小和位置。实际上,CPython中的“列表”数据类型的工作方式与许多其他语言可能称为列表(例如链表)的方式不同-它的实现方式更类似于其他语言可能调用数组的方式,尽管这里也存在一些差异。
相反,您可能会对collections.deque
感兴趣,它是一个类似列表的容器,两端都有快速追加和弹出。
去队列支持线程安全、内存高效的附加,并从双队列的任何一侧弹出,在任何方向上都具有大致相同的O(1)性能。
在名称appendleft
和popleft
下提供了您所询问的缺少的方法:
appendleft(x)
将x添加到双队列的左侧。
popleft()
从双端队列左侧移除并返回一个元素。如果不存在任何元素,则引发IndexError。
当然,这是一个权衡,索引或插入/删除接近双队列中间的速度很慢。事实上,deque.insert(index, object)
甚至不可能是before Python 3.5,你需要旋转,插入/弹出,然后旋转回来。你还会丢失切片,所以如果你需要的话,你不得不写一些烦人的东西,比如itertools.islice
。
有关deque
与list
数据结构的优缺点的进一步讨论,请参见How are deques in Python implemented, and when are they worse than lists?
发布于 2020-08-19 13:02:00
在Python3中
我们有一个列表上的插入方法。获取需要添加的值以及要添加该值的索引。
arrayOrList = [1,2,3,4,5]
arrayOrList.insert(0 , 0)
print(arrayOrList)
https://stackoverflow.com/questions/34210969
复制相似问题