tuplas - Insertar elemento en la lista de Python después de cada elemento nth
metodos de listas en python (7)
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?
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]
Este es un tema antiguo, pero carece de la solución más fácil y más "pitónica", imo. No es más que una extensión a la parte 2 de la respuesta aceptada de que podría decirse que mejora la legibilidad (y por lo tanto, la hace más pitón).
>>> 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'']
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
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]
Tengo dos forros.
Dado:
>>> letters = [''a'',''b'',''c'',''d'',''e'',''f'',''g'',''h'',''i'',''j'']
Use
enumerate
para obtener el índice, agregue''x''
cada 3ra letra, por ejemplo :mod(n, 3) == 2
, luego concatene en una cadena ylist()
.>>> 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.
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.
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 usar la receta de grouper
de la documentación de itertools para la fragmentación.
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