Estoy usando Python 3. ¿Cómo puedo devolver una copia de la lista 1 con la lista 2 que se inserta en la posición indicada por el índice?

def splice(a, b, n):
a = iter(a)
for i in range(n):
yield next(a)
yield from b
yield from a

…o mejor aún:

def splice2(a, b, n):
a = iter(a)
from itertools import islice
yield from islice(a, n)
yield from b
yield from a

No estoy cortando la lista, estoy cortando un iterador sobre la lista 🙂

Pero lo que realmente quieren de ti es probablemente esto:

def splice3(a, b, n):
res = []
for i in range(n):
res.append(a[i])
res.append(b)
for i in range(n, len(a)):
res.append(a[i])
return res

… que es muy feo.

Producen los mismos resultados, pero los dos primeros no necesitan almacenar todo el resultado en la memoria.

>>> "".join(splice("boom", "red", 2))
'boredom'
>>> "".join(splice2("boom", "red", 2))
'boredom'
>>> "".join(splice3("boom", "red", 2))
'boredom'