Insertar elemento en la lista de Python después de cada elemento nth

Digamos que tengo una lista de Python como esta:

letters = ['a','b','c','d','e','f','g','h','i','j'] 

Quiero insertar una ‘x’ después de cada elemento nth, digamos tres caracteres en esa lista. El resultado debe ser:

 letters = ['a','b','c','x','d','e','f','x','g','h','i','x','j'] 

Entiendo que puedo hacer eso con bucles e inserciones. Lo que realmente estoy buscando es una forma de Pythonish, ¿quizás una de una sola línea?

Tengo dos forros.

Dado:

 >>> letters = ['a','b','c','d','e','f','g','h','i','j'] 
  1. Use enumerate para obtener el índice, agregue 'x' cada 3ra letra, por ejemplo : mod(n, 3) == 2 , luego concatene en una cadena y list() .

     >>> list(''.join(l + 'x' * (n % 3 == 2) for n, l in enumerate(letters))) ['a', 'b', 'c', 'x', 'd', 'e', 'f', 'x', 'g', 'h', 'i', 'x', 'j'] 

    Pero como @ sancho.s señala, esto no funciona si alguno de los elementos tiene más de una letra.

  2. Use comprensiones anidadas para aplanar una lista de listas (a) , divididas en grupos de 3 con 'x' agregada si hay menos de 3 desde el final de la lista.

     >>> [x for y in (letters[i:i+3] + ['x'] * (i < len(letters) - 2) for i in xrange(0, len(letters), 3)) for x in y] ['a', 'b', 'c', 'x', 'd', 'e', 'f', 'x', 'g', 'h', 'i', 'x', 'j'] 

(a) [item for subgroup in groups for item in subgroup] aplana una lista irregular de listas.

Prueba esto

 i = n while i < len(letters): letters.insert(i, 'x') i += (n+1) 

donde n es después de cuántos elementos desea insertar 'x' .

Esto funciona inicializando una variable i y configurándola igual a n . A continuación, configura un bucle while que se ejecuta mientras que i es menor que la longitud de las letters . Luego inserta 'x' en el índice i en letters . Luego debes agregar el valor de n+1 a i . La razón por la que debe hacer n+1 lugar de solo n es porque cuando inserta un elemento en las letters , expande la longitud de la lista en uno.

Intentando esto con tu ejemplo donde n es 3 y quieres insertar 'x' , se vería así

 letters = ['a','b','c','d','e','f','g','h','i','j'] i = 3 while i < len(letters): letters.insert(i, 'x') i += 4 print letters 

que se imprimiría

 ['a', 'b', 'c', 'x', 'd', 'e', 'f', 'x', 'g', 'h', 'i', 'x', 'j'] 

cual es tu resultado esperado

Aunque el uso de list.insert() en un bucle for parece ser más eficiente en la memoria, para hacerlo en una línea, también puede agregar el valor dado al final de cada parte dividida en partes iguales dividida en cada nth índice del lista.

 >>> from itertools import chain >>> n = 2 >>> ele = 'x' >>> lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> list(chain(*[lst[i:i+n] + [ele] if len(lst[i:i+n]) == n else lst[i:i+n] for i in xrange(0, len(lst), n)])) [0, 1, 'x', 2, 3, 'x', 4, 5, 'x', 6, 7, 'x', 8, 9, 'x', 10] 

Un método bastante sencillo:

 >>> letters = ['a','b','c','d','e','f','g','h','i','j'] >>> new_list = [] >>> n = 3 >>> for start_index in range(0, len(letters), n): ... new_list.extend(letters[start_index:start_index+n]) ... new_list.append('x') ... >>> new_list.pop() 'x' >>> new_list ['a', 'b', 'c', 'x', 'd', 'e', 'f', 'x', 'g', 'h', 'i', 'x', 'j'] 

También puede utilizar la receta de grouper de la documentación de itertools para la fragmentación.

Quiero añadir un nuevo elemento por elemento.

Qué tal esto ?

 a=[2,4,6] for b in range (0,len(a)): a.insert(b*2,1) 

un es ahora

 [1, 2, 1, 4, 1, 6] 

Este es un tema antiguo, pero carece de la solución más fácil y más “pythonica”, imo. No es más que una extensión a la parte 2 de la respuesta aceptada de Mark Mikofski que posiblemente mejora la legibilidad (y por lo tanto la hace más python).

 >>> letters = ['a','b','c','d','e','f','g','h','i','j'] >>> [el for y in [[el, 'x'] if idx % 3 == 2 else el for idx, el in enumerate(letters)] for el in y] ['a', 'b', 'c', 'x', 'd', 'e', 'f', 'x', 'g', 'h', 'i', 'x', 'j'] 
 l = ['a','b','c','d','e','f','g','h','i','j'] [ l.insert(n+(n+1)*i, 'x') for i in range(len(l)/n) ] print l