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

gen*_*gen 434 python variables list append

我有一个整数和一个列表.我想创建一个以变量开头并以列表结尾的新列表.写a + list我得错了.编译器处理a为整数,因此我不能使用append或extend.你会怎么做?

Nul*_*ify 662

>>>var=7
>>>array = [1,2,3,4,5,6]
>>>array.insert(0,var)
>>>array
[7, 1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

array.insert(index, value)

在给定位置插入项目.第一个参数是要插入的元素的索引,因此array.insert(0, x)插入列表的前面,并且array.insert(len(array), x)等效于array.append(x).Negative值被视为相对于数组的末尾.

  • 最有效的方法.比[x] + [y]快.见这里的解决方案:http://stackoverflow.com/questions/8537916/whats-the-idiomatic-syntax-for-prepending-to-a-short-python-list (10认同)
  • 问题清楚地表明应该创建一个_new_列表.所以这可能很快 - 但错了.;-) (4认同)

Roh*_*ain 519

>>> a = 5
>>> li = [1, 2, 3]
>>> [a] + li  # Don't use 'list' as variable name.
[5, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

  • 我刚做了一些基准测试.`li.insert(0,a)`比`li = [a] + li`快约5倍.如果您多次这样做,请记住这一点. (336认同)
  • @MarcelPfeiffer应该注意`li.insert(0,a)`正在改变`li`.`li = [a] + li`正在为所有值创建一个新实例.如果其他事物引用了列表实例,那么这是一个重要的区别. (75认同)
  • @KeminZhou我更喜欢名字"prepend",因为它自然地来自"append",因为"push_front"自然地来自"push_back". (14认同)
  • python添加list.push_front(item)函数会很不错.这将是显而易见的,不易出错. (4认同)

tim*_*geb 93

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

列表未针对前端的修改进行优化,并且somelist.insert(0, something)O(n)操作.

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

要使用的正确数据结构deque来自collections模块.deques暴露了一个类似于列表的接口,但是针对来自两个端点的修改进行了优化.他们有一种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
Run Code Online (Sandbox Code Playgroud)

  • 有时切换结构不是一件容易的事情,如果你需要在前面附加一堆东西,你可以调用 .reverse 然后将所有东西添加到最后,然后再次调用 reverse 。你会得到两个 O(n) 操作,然后使用 O(1) 添加列表。 (6认同)

v2b*_*v2b 38

另一种做同样的方式,

list[0:0] = [a]
Run Code Online (Sandbox Code Playgroud)

  • 你不需要前面的0.冒号已经说明在开始之前 - my_list [:0] = [a]这样做. (22认同)
  • 了解这一点很有趣,但我会避免这样做,因为我认为这可能会引起混淆。 (4认同)
  • 这并不优雅,会造成不必要的混乱并且难以阅读。 (2认同)

sah*_*dre 11

list_1.insert(0,ur_data)
Run Code Online (Sandbox Code Playgroud)

确保 ur_data 是字符串类型,因此如果您已将data= int(5)其转换为ur_data = str(data)


Dov*_*mon 9

基于使用该timeit模块的一些(最小)基准测试,以下内容的性能似乎与接受的答案相似,如果不是更好的话

new_lst = [a, *lst]
Run Code Online (Sandbox Code Playgroud)

[a] + list这将创建一个新列表而不是 mutate lst

如果您的目的是改变列表,请使用lst.insert(0, a).


Hoa*_*ell 6

您可以使用“解压缩”列表:

a = 5

li = [1,2,3]

li = [a,* li]

=> [5,1,2,3]


Ben*_*ari 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
Run Code Online (Sandbox Code Playgroud)

[注意]:

collections.dequelist在循环Relevant-Post 中比纯 Python 快。