Append integer to beginning of list in Python
我有一个整数和一个列表。我想创建一个新的列表,其中以变量开头,以列表结尾。写a + list时,我会出错。编译器将a作为整数处理,因此我不能使用append或extend。你会怎么做?
1 2 3 4 5
| >>>var=7
>>>array = [1,2,3,4,5,6]
>>>array.insert(0,var)
>>>array
[7, 1, 2, 3, 4, 5, 6] |
它是如何工作的:
array.insert(index, value)
在给定位置插入项目。第一个参数是要插入的元素的索引,因此array.insert(0, x)插入到列表的前面,array.insert(len(array), x)等价于array.append(x)。负值被视为相对于数组的结尾。
- 最有效的方法。比[X]+[Y]快。请参阅此处的解决方案:stackoverflow.com/questions/8537916/…
- 这个问题清楚地表明应该创建一个新的列表。所以这可能很快——但错了。-)
- @21点问题是如何在列表的开头附加整数。无论他描述什么,这都不是正确的做法。那么为什么要引导他走上错误的道路呢?当有更好的事情可以满足他的要求时。
- 他所描述的一切可能正是他所需要的。你怎么知道不需要使用副本而不是更改原始列表?例如,它可能是一个函数的参数,调用方不希望修改列表,它会在程序中引入一个错误。
- 在这种情况下,问题标题应该是不同的。不管怎样,没有争论的必要,因为这一点对我们双方都很清楚。不管怎样,谢谢你的指点。:)
- 我听到这个答案比选出来的答案要高得多。
1 2 3 4
| >>> a = 5
>>> li = [1, 2, 3]
>>> [a] + li # Don't use 'list' as variable name.
[5, 1, 2, 3] |
- 我刚刚做了一些基准测试。li.insert(0, a)比li = [a] + li快约5倍。如果你经常这样做,请记住这一点。
- @Marcelpfeiffer应该指出,li.insert(0, a)正在突变li。li = [a] + li正在创建一个新的实例,将所有的值。如果其他事物引用列表实例,这是一个重要区别。
- 对于python来说,最好添加一个list.push-front(item)函数。这将是显而易见的,并且不太容易出错。
- @我更喜欢"prepend"这个名字,因为它自然地从"append"开始,因为"push-front"自然地从"push-back"开始。
- @美洲驼之神,我同意你的看法。越短越好。
- @Marcel Pfeiffer collections.deque.appendleft()对于大Len(li)来说应该更快。
- @马塞尔菲弗,但那可不像Python!
- 从下面的@timgeb回答是有意义的,特别是如果列表前面有太多的插入。
请注意,如果您经常尝试执行该操作,特别是在循环中,那么列表是错误的数据结构。
列表没有针对前面的修改进行优化,somelist.insert(0, something)是O(N)操作。
somelist.pop(0)和del somelist[0]也是O(N)操作。
要使用的正确数据结构是来自collections模块的deque。Deques公开了一个类似于列表的接口,但针对两个端点的修改进行了优化。他们在前面有一个用于插入的appendleft方法。
演示:
1 2 3 4 5 6 7
| 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 |
- 有时候交换结构不是一件容易的事情,如果你需要在前面附加一堆东西,你可以调用它。反转然后把所有的东西添加到末尾,然后再次调用反转。您将得到两个O(N)操作,然后使用列表的O(1)加法。
另一种方法是,
- 你不需要前0个。冒号已经说这是开始之前的事了——我的列表[:0]=[A]就这样做了。
- 优雅的解决方案!
- 这很有趣,但我会避免,因为我认为这可能会引起混乱。
您可以使用解包列表:
a = 5
li = [1,2,3]
li = [a, *li]
=> [5, 1, 2, 3]
基于使用timeit模块的一些(最小)基准,下面的性能似乎与公认的答案类似,但并不比公认的答案更好。
与[a] + list一样,这将创建一个新的列表,而不会使lst发生变异。
如果你想改变列表,那么就使用lst.insert(0, a)。
只需将列表添加到一起就可以创建新列表。
1 2 3 4
| list1 = ['value1','value2','value3']
list2 = ['value0']
newlist=list2+list1
print(newlist) |
- 这已经被最高评价的答案所覆盖。请解释这是如何为问题添加新信息的。
- 哦,没什么大不了的
1
| list_1.insert(0,ur_data) |
确保您的数据是字符串类型所以如果你有data= int(5)把它转换成ur_data = str(data)。
这些都不适合我。我将第一个元素转换为一个系列(单个元素系列)的一部分,并将第二个元素也转换为一个系列,然后使用append函数。
1
| l = ((pd.Series(<first element>)).append(pd.Series(<list of other elements>))).tolist() |