我想知道为什么Python中的默认list
没有任何shift
,unshift
方法。也许有一个明显的原因,就像列表在内存中的排序方式一样。
目前,我知道我可以使用append在列表末尾添加项目并删除以删除元素。但是,我只能使用列表连接来模仿缺少shift
或unshift
方法的行为。
>>>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]
我错过了什么吗?
答案 0 :(得分:23)
Python列表针对快速固定长度操作进行了优化,并导致pop(0)
和insert(0, v)
操作的O(n)内存移动成本,这些操作会更改基础数据表示的大小和位置。实际上,"列表" CPython中的数据类型与许多其他语言可能称之为列表(例如链接列表)的工作方式不同 - 它的实现方式与其他语言可能称为数组的方式类似,尽管这里存在一些差异太
您可能感兴趣的是collections.deque
,这是一个类似列表的容器,两端都有快速追加和弹出。
Deques支持线程安全,内存有效的追加和双端队列的弹出,在任一方向上具有大致相同的O(1)性能。您似乎要询问的遗漏方法在名称appendleft
和popleft
下提供:
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
。
有关deque
与list
数据结构的优缺点的进一步讨论,请参阅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)