在Python中将整数添加到列表开头

769

如何在列表开头加上一个整数?

[1, 2, 3][42, 1, 2, 3]

1
从计算时间的角度来看,new_list = [x] + your_listyour_list.insert(x) 效率低吗? - Charlie Parker
10个回答

1244
>>> x = 42
>>> xs = [1, 2, 3]
>>> xs.insert(0, x)
>>> xs
[42, 1, 2, 3]

工作原理:

list.insert(index, value)

在指定位置插入一个元素。第一个参数是要插入元素之前的索引,因此 xs.insert(0, x) 在列表开头插入元素,xs.insert(len(xs), x) 相当于 xs.append(x)。负数索引表示相对于列表末尾的位置。


28
最高效的方法。比[x]+[y]更快。请参见此处的解决方案:https://dev59.com/z2oy5IYBdhLWcg3wddxv - Simon Steinberger
1
@BlackJack 这个问题是关于如何将整数添加到列表开头的。无论他描述的是什么,那都不是正确的方法。为什么要引导他走错误的道路?当有更好的方法可以满足他的需求时。 - Kousik
1
在这种情况下,问题标题应该不同。无论如何,争论没有意义,因为我们双方都明确了重点。无论如何,感谢您的指出。 :) - Kousik
使用append()和reverse()函数,而不是insert(0,val)函数,因为它会涉及到每个元素的移动,所以会花费更多时间。我曾经由于使用insert函数而遇到超时问题。 - Tomato Master
从计算时间的角度来看,new_list = [x] + your_listyour_list.insert(x) 效率低吗? - Charlie Parker
显示剩余2条评论

600
>>> x = 42
>>> xs = [1, 2, 3]
>>> [x] + xs
[42, 1, 2, 3]

注意:不要使用list作为变量名。


401
我刚进行了一些基准测试。li.insert(0, a)li = [a] + li快大约5倍。如果你需要经常这样做,请记住这一点。 - Marcel Pfeiffer
101
需要注意的是,li.insert(0, a) 会改变 li 的值。而 li = [a] + li 则会创建一个新的实例并将所有值复制到其中。如果其他对象引用了该列表实例,则这是一个重要的区别。 - unholysampler
6
Python最好能添加一个list.push_front(item)函数,这将更加直观和减少出错的可能性。 - Kemin Zhou
23
我认为“prepend”这个名称更合适,因为它与“append”的关系就像“push_front”与“push_back”的关系一样自然。 - god of llamas
1
@Marcel Pfeiffer 对于长度较大的li,collections.deque.appendleft() 应该会更快。 - cowbert
显示剩余4条评论

133

请注意,如果您经常尝试执行该操作,尤其是在循环中,列表是错误的数据结构

列表不适用于在前面进行修改,并且somelist.insert(0, something)是一个O(n)操作

somelist.pop(0)del somelist[0]也是O(n)操作。

正确使用的数据结构是来自collections模块的deque。双端队列公开了类似于列表的接口,但是针对从两个端点进行修改进行了优化。它们具有appendleft方法,以便在前面插入。

演示:

In [1]: lst = [0]*1000
In [2]: timeit -n1000 lst.insert(0, 1)
1000 loops, best of 3: 794 ns per loop
In [3]: from collections import deque
In [4]: deq = deque([0]*1000)
In [5]: timeit -n1000 deq.appendleft(1)
1000 loops, best of 3: 73 ns per loop

6
有时候改变结构并不容易,如果你需要在前面添加一堆东西,可以先调用 .reverse,然后将所有东西添加到末尾,最后再次调用 reverse。这样做会进行两个 O(n) 的操作,但是可以使用列表的 O(1) 添加方式。 - Tatarize
1
从计算时间的角度来看,new_list = [x] + your_listyour_list.insert(x) 效率低吗? - Charlie Parker
不过这不是问题所在。请记住,有时候你并不是创建了列表,而是从其他团队/库中获取的,你想在前面添加。有时候你无法控制外部因素。 :-) - Neil

54

另一种做法:

list[0:0] = [a]

32
不需要第一个0。冒号已经表示这是在开头之前--my_list[:0]=[a]就可以实现。 - Stefan Gruenwald
优雅的解决方案! - Shejo284
4
了解这件事情是很有趣的,但我会避免这么做,因为我认为它可能会引起混淆。 - xjcl
2
这不够优雅,令人不必要地感到混乱和阅读困难。 - pigi5

24

您可以使用解包列表:

a = 5

li = [1,2,3]

li = [a, *li]

=> [5, 1, 2, 3]


12

通过使用timeit模块进行一些(最小)基准测试,似乎以下内容具有类似或更好的性能,而不是已接受的答案。

new_lst = [a, *lst]
[a] + list 一样,这将创建一个新的列表而不是改变 lst
如果您的意图是改变列表,则使用 lst.insert(0, a)

11
list_1.insert(0,ur_data)

确保你的数据是字符串类型 所以如果你有 data= int(5) 将其转换为 ur_data = str(data)


5

替代方案:

>>> from collections import deque

>>> my_list = deque()
>>> my_list.append(1)       # append right
>>> my_list.append(2)       # append right
>>> my_list.append(3)       # append right
>>> my_list.appendleft(100) # append left
>>> my_list

deque([100, 1, 2, 3])

>>> my_list[0]

100

[注意]:

collections.deque 在循环中比 Python 纯 list 更快速 相关帖子


非常感谢。这让我通过了我的Codeforces问题。 - Kirti Purohit

2

这些方法对我都不起作用。我将第一个元素转换为序列(一个仅有一个元素的序列),将第二个元素也转换为序列,并使用append函数。

l = ((pd.Series(<first element>)).append(pd.Series(<list of other elements>))).tolist()

1

通过简单地将列表添加在一起,可以创建新的列表。

list1 = ['value1','value2','value3']
list2 = ['value0']
newlist=list2+list1
print(newlist)

3
这已经被排名最高的答案涵盖了。请解释这如何为问题增加新信息。 - Mike Scotty
4
哦,它没有添加任何东西。 - Erico9001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接