首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Python的列表没有shift/unshift方法?

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

Stack Overflow用户
提问于 2015-12-11 04:18:31
回答 2查看 31.2K关注 0票数 38

我想知道为什么Python语言中的默认list没有任何shiftunshift方法。也许有一个显而易见的原因,比如列表在内存中的排序方式。

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

代码语言:javascript
运行
复制
>>> 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]

我错过了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-11 04:50:49

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

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

去队列支持线程安全、内存高效的附加,并从双队列的任何一侧弹出,在任何方向上都具有大致相同的O(1)性能。

在名称appendleftpopleft下提供了您所询问的缺少的方法:

appendleft(x)

将x添加到双队列的左侧。

popleft()

从双端队列左侧移除并返回一个元素。如果不存在任何元素,则引发IndexError。

当然,这是一个权衡,索引或插入/删除接近双队列中间的速度很慢。事实上,deque.insert(index, object)甚至不可能是before Python 3.5,你需要旋转,插入/弹出,然后旋转回来。你还会丢失切片,所以如果你需要的话,你不得不写一些烦人的东西,比如itertools.islice

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

票数 53
EN

Stack Overflow用户

发布于 2020-08-19 13:02:00

在Python3中

我们有一个列表上的插入方法。获取需要添加的值以及要添加该值的索引。

代码语言:javascript
运行
复制
arrayOrList  = [1,2,3,4,5]
arrayOrList.insert(0 , 0) 
print(arrayOrList)
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34210969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档