Dividir cadena cada enésimo carácter

Resuelto Brandon L Burnett asked hace 12 años • 0 respuestas

¿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? .

Brandon L Burnett avatar Feb 28 '12 08:02 Brandon L Burnett
Aceptado
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range(0, len(line), n)]
['12', '34', '56', '78', '90']
satomacoto avatar Feb 28 '2012 02:02 satomacoto

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.finditersi la cadena es larga para generar fragmento por fragmento.

the wolf avatar Feb 28 '2012 06:02 the wolf

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 wrapdice 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.
'''
Diptangsu Goswami avatar Feb 19 '2018 06:02 Diptangsu Goswami

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().

Andrew Clark avatar Feb 28 '2012 02:02 Andrew Clark

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)))
Russell Borogove avatar Feb 28 '2012 01:02 Russell Borogove