Append integer to beginning of list in Python

1,035,393

Solution 1

>>>var=7
>>>array = [1,2,3,4,5,6]
>>>array.insert(0,var)
>>>array
[7, 1, 2, 3, 4, 5, 6]

How it works:

array.insert(index, value)

Insert an item at a given position. The first argument is the index of the element before which to insert, so array.insert(0, x) inserts at the front of the list, and array.insert(len(array), x) is equivalent to array.append(x).Negative values are treated as being relative to the end of the array.

Solution 2

>>> a = 5
>>> li = [1, 2, 3]
>>> [a] + li  # Don't use 'list' as variable name.
[5, 1, 2, 3]

Solution 3

Note that if you are trying to do that operation often, especially in loops, a list is the wrong data structure.

Lists are not optimized for modifications at the front, and somelist.insert(0, something) is an O(n) operation.

somelist.pop(0) and del somelist[0] are also O(n) operations.

The correct data structure to use is a deque from the collections module. deques expose an interface that is similar to those of lists, but are optimized for modifications from both endpoints. They have an appendleft method for insertions at the front.

Demo:

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

Solution 4

Another way of doing the same,

list[0:0] = [a]

Solution 5

You can use Unpack list:

a = 5

li = [1,2,3]

li = [a, *li]

=> [5, 1, 2, 3]

Share:
1,035,393
gen
Author by

gen

Updated on July 11, 2022

Comments

  • gen
    gen almost 2 years

    I have an integer and a list. I would like to make a new list of them beginning with the variable and ending with the list. Writing a + list I get errors. The compiler handles a as integer, thus I cannot use append, or extend either. How would you do this?

  • Stefan Gruenwald
    Stefan Gruenwald over 9 years
    You don't need the first 0. The colon already say that's before the start -- my_list[:0]=[a] does it.
  • Marcel Pfeiffer
    Marcel Pfeiffer almost 9 years
    I just did some benchmarking. li.insert(0, a) is around 5x faster than li = [a] + li. Keep this in mind if you are doing this many times.
  • unholysampler
    unholysampler almost 9 years
    @MarcelPfeiffer It should be noted that li.insert(0, a) is mutating li. li = [a] + li is creating a new instance will all of the values. This is an important distinction if other things have a reference to the list instance.
  • Simon Steinberger
    Simon Steinberger over 8 years
    The most efficient approach. Faster than [x]+[y]. See solutions here: stackoverflow.com/questions/8537916/…
  • Kemin Zhou
    Kemin Zhou over 7 years
    It would be nice for python to add a list.push_front(item) function. This will be obvious and less error-prone.
  • Nullify
    Nullify over 7 years
    @BlackJack The question is about how to append integer to beginning of list. Whatever he describe that is not the right thing to follow. So why to guide him to take the wrong path? when there are better thing he can do for his requirement.
  • Nullify
    Nullify over 7 years
    In that case question title should be different. Anyway there is no point of arguing, as the point is clear for both of us. Anyway thank you for pointing out. :)
  • god of llamas
    god of llamas over 7 years
    @KeminZhou I'd prefer the name "prepend" as it follows naturally from "append" as "push_front" follows naturally from "push_back".
  • Kemin Zhou
    Kemin Zhou over 7 years
    @god of llamas, I agree with you. Shorter is always better.
  • Shejo284
    Shejo284 about 7 years
    Elegant solution!
  • cowbert
    cowbert over 6 years
    @Marcel Pfeiffer collections.deque.appendleft() should be even faster for large len(li).
  • Mike Scotty
    Mike Scotty about 6 years
    This is already covered by the top rated answer. Please explain how this adds new information to the issue.
  • Erico9001
    Erico9001 about 6 years
    O, it adds nothing
  • hacksoi
    hacksoi almost 6 years
    @MarcelPfeiffer but that's not as pythonic!
  • Tatarize
    Tatarize over 5 years
    Sometimes switching structures isn't a thing you can do easily, and if you need to append a bunch of stuff to the front, you can call .reverse then add all the stuff to the end, then call reverse again. You'd get two O(n) operations but then use the O(1) adds of list.
  • xjcl
    xjcl about 5 years
    This is interesting to know about, but I would avoid this because I think it might cause confusion.
  • Ravi R
    Ravi R almost 5 years
    Answer from @timgeb below makes sense esp. if there are too many inserts at front of list.
  • EMiller
    EMiller almost 5 years
    I hear by boost this answer to have more points than the selected one.
  • Tomato Master
    Tomato Master about 3 years
    use append(), then reverse() function, as insert(0,val) function will take more time,because it will involve shifting of every element. i have experienced a time out issue due to insert
  • Nullify
    Nullify about 3 years
    @VishalYadav Can you please share the benchmarking?
  • Tomato Master
    Tomato Master about 3 years
    @Nullify , for example appending and reversing of 10000000 elements took almost 1.2 seconds which is equal to inserting 100 elements at 0th postion of a list.Below is the code to test, link will expire in a day , have a look ctxt.io/2/AACgpeUnFg
  • Charlie Parker
    Charlie Parker almost 3 years
    in terms of computation time, is new_list = [x] + your_list less efficient than your_list.insert(x)?
  • Charlie Parker
    Charlie Parker almost 3 years
    in terms of computation time, is new_list = [x] + your_list less efficient than your_list.insert(x)?
  • Charlie Parker
    Charlie Parker almost 3 years
    in terms of computation time, is new_list = [x] + your_list less efficient than your_list.insert(x)?
  • pigi5
    pigi5 over 2 years
    This is not elegant, it's unnecessarily confusing and difficult to read.
  • Kirti Purohit
    Kirti Purohit almost 2 years
    Thank you so much. This made me pass my codeforces problem