list.append()附加到列表的末尾。这解释了list.prepend()不存在的原因,因为考虑到大型列表的性能。对于一个短列表,我如何预先一个值?


当前回答

在我看来,在Python中,将一个元素或列表前置到另一个列表的最优雅和惯用的方法是使用展开操作符*(也称为解包操作符),

# Initial list
l = [4, 5, 6]

# Modification
l = [1, 2, 3, *l]

其中修改后的结果列表为[1,2,3,4,5,6]

我还喜欢用运算符+简单地将两个列表组合在一起,如下所示,

# Prepends [1, 2, 3] to l
l = [1, 2, 3] + l

# Prepends element 42 to l
l = [42] + l

我不喜欢另一种常见的方法,l.insert(0, value),因为它需要一个神奇的数字。此外,insert()只允许在单个元素前加上前缀,但是上面的方法在单个元素或多个元素前加上前缀时具有相同的语法。

其他回答

我们来看4种方法

使用insert ()

>>> 
>>> l = list(range(5))
>>> l
[0, 1, 2, 3, 4]
>>> l.insert(0, 5)
>>> l
[5, 0, 1, 2, 3, 4]
>>> 

使用[]和+

>>> 
>>> l = list(range(5))
>>> l
[0, 1, 2, 3, 4]
>>> l = [5] + l
>>> l
[5, 0, 1, 2, 3, 4]
>>> 

使用切片

>>> 
>>> l = list(range(5))
>>> l
[0, 1, 2, 3, 4]
>>> l[:0] = [5]
>>> l
[5, 0, 1, 2, 3, 4]
>>> 

使用collections.deque.appendleft ()

>>> 
>>> from collections import deque
>>> 
>>> l = list(range(5))
>>> l
[0, 1, 2, 3, 4]
>>> l = deque(l)
>>> l.appendleft(5)
>>> l = list(l)
>>> l
[5, 0, 1, 2, 3, 4]
>>> 

这将创建一个带x的新列表,而不是修改现有的列表:

new_list = [x] + old_list

s.insert(0, x)形式是最常见的。

无论何时看到它,都应该考虑使用collections.deque而不是列表。deque的前置操作在常数时间内运行。列表的前置操作以线性时间运行。

如果有人像我一样发现了这个问题,下面是我对所提方法的性能测试:

Python 2.7.8

In [1]: %timeit ([1]*1000000).insert(0, 0)
100 loops, best of 3: 4.62 ms per loop

In [2]: %timeit ([1]*1000000)[0:0] = [0]
100 loops, best of 3: 4.55 ms per loop

In [3]: %timeit [0] + [1]*1000000
100 loops, best of 3: 8.04 ms per loop

正如你所看到的,插入和切片赋值的速度几乎是显式添加的两倍,并且结果非常接近。正如Raymond Hettinger所指出的那样,插入是更常见的选项,我个人更喜欢这种方式来添加列表。

在我看来,在Python中,将一个元素或列表前置到另一个列表的最优雅和惯用的方法是使用展开操作符*(也称为解包操作符),

# Initial list
l = [4, 5, 6]

# Modification
l = [1, 2, 3, *l]

其中修改后的结果列表为[1,2,3,4,5,6]

我还喜欢用运算符+简单地将两个列表组合在一起,如下所示,

# Prepends [1, 2, 3] to l
l = [1, 2, 3] + l

# Prepends element 42 to l
l = [42] + l

我不喜欢另一种常见的方法,l.insert(0, value),因为它需要一个神奇的数字。此外,insert()只允许在单个元素前加上前缀,但是上面的方法在单个元素或多个元素前加上前缀时具有相同的语法。