我可以在 Python 中使用前置元素而不是附加来扩展列表吗?

Posted

技术标签:

【中文标题】我可以在 Python 中使用前置元素而不是附加来扩展列表吗?【英文标题】:Can I extend list in Python with prepend elements instead of append? 【发布时间】:2013-11-13 04:51:44 【问题描述】:

我会表演

a = [1,2,3]
b = [4,5,6]
a.extend(b)
# a is now [1,2,3,4,5,6]

有没有办法执行扩展列表并将新项目添加到列表开头的操作?

这样

a = [1,2,3]
b = [4,5,6]
a.someaction(b)
# a is now [4,5,6,1,2,3]

如果重要的话,我使用版本 2.7.5。

【问题讨论】:

你为什么不能b.extend(a) @iCodez:有时a 被称为very_importantb 被称为aux。您可能希望保留前者而忘记后者。 【参考方案1】:

您可以分配给切片:

a[:0] = b

演示:

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a[:0] = b
>>> a
[4, 5, 6, 1, 2, 3]

本质上,list.extend() 是对list[len(list):] 切片的赋值。

您可以在任何位置“插入”另一个列表,只需寻址该位置的空切片:

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a[1:1] = b
>>> a
[1, 4, 5, 6, 2, 3]

【讨论】:

遗憾的是,a[-1:] 不起作用(原因很明显)。拥有对称性会很好,但是唉…… @JürgenA.Erhard:绝对是对称的,但-1 不是列表的末尾,它是最后一个元素。 a[-1:] 与列表开头的 a[:1] 对称,都包含 1 个元素。这就是为什么我在回答中明确提到len(list)【参考方案2】:

如果您需要快速操作并且您需要能够访问任意元素,请尝试使用 treap 或红黑树。

>>> import treap as treap_mod
>>> treap = treap_mod.treap()
>>> for i in range(100000):
...    treap[i] = i
...
>>> treap[treap.find_min() - 1] = -1
>>> treap[100]
100

大多数对 treaps 和红黑树的操作都可以在 O(log(n)) 中完成。据称 Treap 的平均速度更快,但红黑树的操作时间差异较小。

【讨论】:

【参考方案3】:

你可以使用collections.deque:

import collections
a = collections.deque([1, 2, 3])
b = [4, 5, 6]
a.extendleft(b[::-1])

【讨论】:

如果您不需要能够访问任意元素,这是最好的方法。插入和添加列表往往会产生二次算法,其中线性是可能的。【参考方案4】:

这就是你需要的 ;-)

a = b + a

【讨论】:

你最终会添加相应的数组元素。 @magarwal 仅当您使用 numpy 时。 如果你需要修改a,试试这个:>>> a is b+ab+a既不是b也不是a,而是一个全新的对象);)

以上是关于我可以在 Python 中使用前置元素而不是附加来扩展列表吗?的主要内容,如果未能解决你的问题,请参考以下文章

Python集合(set)的操作方法汇总(约20种操作方法),并附示例代码

连接,但前置而不是附加[重复]

如何防止前置滚动?

如何在android中使用前置摄像头[重复]

可以为 jQuery 前置动画吗?

JSON 结果在 Swift 中的 Tableview 中显示结果列表,而不是每个单元格中的每个结果(附图片)[关闭]