¿Es posible dividir una cadena cada enésimo carácter?
Por ejemplo, supongamos que tengo una cadena que contiene lo siguiente:
'1234567890'
¿Cómo puedo hacer que se vea así?
['12','34','56','78','90']
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range(0, len(line), n)]
['12', '34', '56', '78', '90']
Solo para completar, puedes hacer esto con una expresión regular:
Para un número impar de caracteres, puede hacer esto:
También puede hacer lo siguiente para simplificar la expresión regular para fragmentos más largos:
Y puede usar
re.finditer
si la cadena es larga para generar fragmento por fragmento.fuente
'.'*n
para dejarlo más claro. Sin unión, sin compresión, sin bucles, sin comprensión de la lista; solo encuentra los siguientes dos personajes uno al lado del otro, que es exactamente como un cerebro humano piensa al respecto. Si Monty Python todavía estuviera vivo, ¡le encantaría este método!flags=re.S
.Ya hay una función incorporada en Python para esto.
Esto es lo que dice la cadena de documentación para wrap:
fuente
wrap
Es posible que no devuelva lo que se solicita si la cadena contiene espacio. por ejemplo,wrap('0 1 2 3 4 5', 2)
devoluciones['0', '1', '2', '3', '4', '5']
(los elementos seOtra forma común de agrupar elementos en grupos de longitud n:
Este método viene directamente de los documentos para
zip()
.fuente
zip(*[iter(s)]*2)
difícil de entender, lea ¿Cómozip(*[iter(s)]*n)
funciona en Python? .>>> map(''.join, zip(*[iter('01234567')]*5))
->['01234']
zip()
conitertools.zip_longest()
:map(''.join, zip_longest(*[iter(s)]*2, fillvalue=''))
maps()
Creo que esto es más corto y más legible que la versión de itertools:
fuente
Me gusta esta solución:
fuente
Usando más itertools de PyPI:
fuente
Puedes usar la
grouper()
receta deitertools
:Python 2.x:
Python 3.x:
Estas funciones son eficientes en memoria y funcionan con cualquier iterable.
fuente
Prueba el siguiente código:
fuente
yield ''.join(piece)
para que funcione como se esperaba: eval.in/813878fuente
Prueba esto:
Salida:
fuente
Como siempre, para aquellos que aman uno
fuente
print(line)
recibothis is a line split into n characters
como la salida. ¿Podría ser mejor ponerline = [line[i * n:i * n+n] for i,blah in enumerate(line[::n])]
:? Arregla esto y es una buena respuesta :).,blah
y por qué es necesario? Noto que puedo reemplazarblah
con cualquier carácter alfabético / s, pero no números, y no puedo eliminar lablah
/ o la coma. Mi editor sugiere agregar espacios en blanco después de,
: senumerate
devuelve dos iterables, por lo que necesita dos lugares para colocarlos. Pero en realidad no necesita el segundo iterable para nada en este caso.blah
preferir usar un guión bajo o doble, ver: stackoverflow.com/questions/5893163/…Una solución recursiva simple para cadena corta:
O en tal forma:
, que ilustra el patrón típico de divide y vencerás en el enfoque recursivo de manera más explícita (aunque prácticamente no es necesario hacerlo de esta manera)
fuente
Estaba atrapado en el mismo escenario.
Esto funciono para mi
Salida
fuente
more_itertools.sliced
ha sido mencionado antes. Aquí hay cuatro opciones más de lamore_itertools
biblioteca:Cada una de las últimas opciones produce el siguiente resultado:
La documentación de opciones discutidas:
grouper
,chunked
,windowed
,split_after
fuente
Esto se puede lograr mediante un bucle simple.
La salida se ve como ['12', '34', '56', '78', '90', 'a']
fuente