21

你有

x = ['a', 'b', 'c']
y = [1, 2, 3]

并想y在开头插入列表x

x = [1, 2, 3, 'a', 'b', 'c']

在 Python 中执行此操作的最佳解决方案是什么?

4

4 回答 4

30
>>> x = ['a', 'b', 'c']
>>> y = [1, 2, 3]
>>> x = y + x

deque对于较小的输入大小,这个简单的解决方案的运行速度是解决方案的两倍:

$ cat x1.py 
for i in range(1000000):
    x = ['a', 'b', 'c']
    y = [1, 2, 3]
    x = y + x

$ cat x2.py 
from collections import deque
for i in range(1000000):
    d = deque(['a', 'b', 'c'])
    d.extendleft(reversed([1, 2, 3]))

$ time python x1.py

real    0m1.912s
user    0m1.864s
sys     0m0.040s

$ time python x2.py

real    0m5.368s
user    0m5.316s
sys     0m0.052s

但是,对于较大的输入,它会变得更慢:

>python -m timeit -s "y = range(100000)" "x = list(xrange(10000000)); y+x"
10 loops, best of 3: 229 msec per loop

>python -m timeit -s "from collections import deque; y = range(100000)" "d = deque(xrange(10000000)); d.extendleft(reversed(y))"
10 loops, best of 3: 178 msec per loop
于 2012-06-19T10:20:38.963 回答
18

当您想在左侧追加时, adeque比列表更有效。使用extendleft方法。

>>> from collections import deque
>>> d = deque(['a', 'b', 'c'])
>>> d.extendleft(reversed([1, 2, 3]))
>>> d
deque([1, 2, 3, 'a', 'b', 'c'])

如果您总是只在左侧追加,请考虑以相反的顺序将元素保留在列表中。

于 2012-06-19T10:11:35.347 回答
17
x[0:0] = y
  • 符号简单
  • 性能特点:未知
  • 保留 id(x)
于 2013-11-08T01:18:22.237 回答
10

根据您对结果所做的事情,也许您根本不想列出清单:

new_x = itertools.chain(y, x)

现在你有了一个迭代器,它将产生 y 中的所有值,然后是 x 中的所有值。现在你可以迭代它:

for val in new_x:
    blah blah
于 2012-06-19T11:56:38.490 回答