list.append()附加到列表的末尾。这解释了list.prepend()不存在的原因,因为考虑到大型列表的性能。对于一个短列表,我如何预先一个值?
当前回答
如果有人像我一样发现了这个问题,下面是我对所提方法的性能测试:
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()只允许在单个元素前加上前缀,但是上面的方法在单个元素或多个元素前加上前缀时具有相同的语法。
s.insert(0, x)形式是最常见的。
无论何时看到它,都应该考虑使用collections.deque而不是列表。deque的前置操作在常数时间内运行。列表的前置操作以线性时间运行。
这将创建一个带x的新列表,而不是修改现有的列表:
new_list = [x] + old_list
我会在python >= 3.0中做一些非常快的事情
list=[0,*list]
这可能不是最有效的方法,但在我看来这是最python化的方法。
如果有人像我一样发现了这个问题,下面是我对所提方法的性能测试:
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所指出的那样,插入是更常见的选项,我个人更喜欢这种方式来添加列表。
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录