Insertar un elemento en un índice específico en una lista y devolver la lista actualizada

Tengo esto:

>>> a = [1, 2, 4] >>> print a [1, 2, 4] >>> print a.insert(2, 3) None >>> print a [1, 2, 3, 4] >>> b = a.insert(3, 6) >>> print b None >>> print a [1, 2, 3, 6, 4] 

¿Hay alguna forma de obtener la lista actualizada como resultado, en lugar de actualizar la lista original en su lugar?

l.insert(index, obj) no devuelve nada, solo actualiza la lista. Como dijo ATO, puedes hacer b = a[:index] + [obj] + a[index:] . Sin embargo, otra forma es:

 a = [1, 2, 4] b = a[:] b.insert(2, 3) 

Más corto obtuve: b = a[:2] + [3] + a[2:]

 >>> >>> a = [1, 2, 4] >>> print a [1, 2, 4] >>> b = a[:2] + [3] + a[2:] >>> print a [1, 2, 4] >>> print b [1, 2, 3, 4] 

El enfoque más eficiente de rendimiento

También puede insertar el elemento utilizando la indexación de segmentos en la lista. Por ejemplo:

 >>> a = [1, 2, 4] >>> insert_at = 2 # index at which you want to insert item >>> b = a[:] # created copy of list "a" as "b" # skip this step if you are ok with modifying original list >>> b[insert_at:insert_at] = [3] # insert "3" within "b" >>> b [1, 2, 3, 4] 

Para insertar varios elementos juntos en un índice determinado , todo lo que necesita hacer es usar una list de los múltiples elementos que desea insertar. Por ejemplo:

 >>> a = [1, 2, 4] >>> insert_at = 2 # index starting from which multiple elements will be inserted # List of elements that you want to insert together at "index_at" (above) position >>> insert_elements = [3, 5, 6] >>> a[insert_at:insert_at] = insert_elements >>> a # [3, 5, 6] are inserted together in `a` starting at index "2" [1, 2, 3, 5, 6, 4] 

Alternativa utilizando la comprensión de lista (pero muy lenta en términos de rendimiento) :

Como alternativa, también se puede lograr utilizando la comprensión de lista con enumerate . (Pero, por favor, no lo hagas de esta manera. Es solo para ilustrar) :

 >>> a = [1, 2, 4] >>> insert_at = 2 >>> b = [y for i, x in enumerate(a) for y in ((3, x) if i == insert_at else (x, ))] >>> b [1, 2, 3, 4] 

Comparación de rendimiento de todas las soluciones

Aquí está la comparación timeit de todas las respuestas con una lista de 1000 elementos para Python 3.4.5:

  • Respuesta minera mediante la inserción en rodajas: la más rápida (3.08 usec por bucle)

     mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b[500:500] = [3]" 100000 loops, best of 3: 3.08 usec per loop 
  • Respuesta aceptada de ATOzTOA basada en la combinación de listas divididas – Segundo (6.71 usec por bucle)

     mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:500] + [3] + a[500:]" 100000 loops, best of 3: 6.71 usec per loop 
  • La respuesta de Rushy Panchal con más votos utilizando list.insert(...) – Tercero (26.5 usec por bucle)

     python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b.insert(500, 3)" 10000 loops, best of 3: 26.5 usec per loop 
  • Respuesta minera con comprensión de lista y enumerate – Cuarto (muy lento con 168 usec por bucle)

     mquadri$ python3 -m timeit -s "a = list(range(1000))" "[y for i, x in enumerate(a) for y in ((3, x) if i == 500 else (x, )) ]" 10000 loops, best of 3: 168 usec per loop 

Utilice el método insert () de la lista de Python . Uso:

Sintaxis

A continuación se muestra la syntax del método insert ():

list.insert(index, obj)

Parámetros

  • índice: este es el índice donde se debe insertar el objeto objeto.
  • obj: este es el objeto que se insertará en la lista dada.

Valor de retorno

Este método no devuelve ningún valor pero inserta el elemento dado en el índice dado.

Ejemplo:

 a = [1,2,4,5] a.insert(2,3) print(a) 

Devoluciones [1, 2, 3, 4, 5]