Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么是Python';s列表没有移位/取消移位方法?_Python_List - Fatal编程技术网

为什么是Python';s列表没有移位/取消移位方法?

为什么是Python';s列表没有移位/取消移位方法?,python,list,Python,List,我想知道为什么Python中默认的列表没有任何shift,unshift方法。也许有一个明显的原因,比如列表在内存中的排列方式 因此,目前我知道我可以使用append在列表末尾添加一个项目,并使用pop从列表末尾删除一个元素。但是,我只能使用列表连接来模拟缺少的shift或unshift方法的行为 >>> a = [1,2,3,4,5] >>> a = [0] + a # Unshift / Push >>> a [0,1,2,3,4,5]

我想知道为什么Python中默认的
列表
没有任何
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]

我错过了什么吗?

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

您可能会对它感兴趣,它是一个类似列表的容器,两端都有快速的附件和pop

deque支持线程安全、内存高效的附加和弹出,在deque的任意一侧,在任意方向上的O(1)性能大致相同

您可能询问的缺少的方法在名称和下提供:

左附录(x)

将x添加到三角形的左侧

popleft()

从deque的左侧移除并返回一个元素。 如果不存在元素,则引发索引器

当然,这是一种折衷,索引或在deque中间附近插入/删除的速度很慢。事实上,
deque.insert(index,object)
甚至是不可能的,你需要旋转,插入/弹出,然后旋转回来。您也会丢失切片,因此如果需要,您将不得不编写一些烦人的东西,例如
itertools.islice

有关
deque
vs
list
数据结构的优缺点的进一步讨论,请参见Python3中的

我们在列表上有insert方法。 获取需要添加的值以及要添加该值的索引

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

pop(0)
insert(0,x)
?您是否用这段代码演示了您可以轻松地移动和取消移动,而无需专用方法?@nobox否,这些都是通过索引进行的。可能值得注意的是,Python的
list
类型实际上不是一个链表,而是一个数组。因此,在列表的开头添加一个值在计算上要比在常规链表中添加一个值花费更多,并且可能会导致(甚至更多)混淆。@VincentSavard更进一步,Python列表是名称数组(本质上类似于指针数组),这也与C中的连续内存数组非常不同。在Python中,为列表元素分配的空间是连续的(通常),但列表元素本身可以是指向内存中各种疯狂角落的名称。通常,如果您需要执行对传统阵列有效的操作,这意味着您应该使用实现缓冲区协议的东西,如array.array或NumPy ndarray,而不是list。