Dividir cadena cada enésimo carácter
¿Cómo divido una cadena cada enésimo carácter?
'1234567890' → ['12', '34', '56', '78', '90']
Para la misma pregunta con una lista, consulte ¿Cómo divido una lista en partes del mismo tamaño? .
Aceptado
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range(0, len(line), n)]
['12', '34', '56', '78', '90']
Para completar, puedes hacer esto con una expresión regular:
>>> import re
>>> re.findall('..','1234567890')
['12', '34', '56', '78', '90']
Para un número impar de caracteres puedes hacer esto:
>>> import re
>>> re.findall('..?', '123456789')
['12', '34', '56', '78', '9']
También puede hacer lo siguiente para simplificar la expresión regular para fragmentos más largos:
>>> import re
>>> re.findall('.{1,2}', '123456789')
['12', '34', '56', '78', '9']
Y puede usarlo re.finditer
si la cadena es larga para generar fragmento por fragmento.
Ya existe una función incorporada en Python para esto.
>>> from textwrap import wrap
>>> s = '1234567890'
>>> wrap(s, 2)
['12', '34', '56', '78', '90']
Esto es lo que wrap
dice la cadena de documentación:
>>> help(wrap)
'''
Help on function wrap in module textwrap:
wrap(text, width=70, **kwargs)
Wrap a single paragraph of text, returning a list of wrapped lines.
Reformat the single paragraph in 'text' so it fits in lines of no
more than 'width' columns, and return a list of wrapped lines. By
default, tabs in 'text' are expanded with string.expandtabs(), and
all other whitespace characters (including newline) are converted to
space. See TextWrapper class for available keyword args to customize
wrapping behaviour.
'''
Otra forma común de agrupar elementos en grupos de n longitudes:
>>> s = '1234567890'
>>> map(''.join, zip(*[iter(s)]*2))
['12', '34', '56', '78', '90']
Este método proviene directamente de los documentos de zip()
.
Creo que esto es más corto y legible que la versión de itertools:
def split_by_n(seq, n):
'''A generator to divide a sequence into chunks of n units.'''
while seq:
yield seq[:n]
seq = seq[n:]
print(list(split_by_n('1234567890', 2)))