Estoy realmente atrapado en una pregunta básica. Estoy tratando de tomar una lista de un elemento y dividirlo en una lista de muchos elementos, cada uno con una longitud de caracteres de 10. Por ejemplo, dar una lista con un elemento, ['111111111122222222223333333333'], el resultado produciría:

1111111111
2222222222
3333333333

Siento que esto es muy simple, pero estoy perplejo. Traté de crear una función como esta:

def parser(nub):    
    while len(nub) > 10:  
        for subnub in nub:  
            subnub = nub[::10]
            return(subnub)  
    else:  
        print('Done')

Obviamente, esto no funciona. ¿Algún consejo? ¿Usar una cadena sería más fácil que una lista?

7
drbunsen 16 jun. 2011 a las 16:57

4 respuestas

La mejor respuesta

Se ha formulado una pregunta relacionada: Cortar una lista en una lista de sublistas

Por ejemplo, si su lista de origen es:

the_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, ... ]

Puedes dividirlo como:

split_list = [the_list[i:i+n] for i in range(0, len(the_list), n)]

Suponiendo que n es la longitud de su sublista y el resultado sería:

[[1, 2, 3, ..., n], [n+1, n+2, n+3, ..., 2n], ...]

Luego puedes recorrerlo como:

for sub_list in split_list:
    # Do something to the sub_list

Lo mismo ocurre con las cuerdas.

Aquí hay un ejemplo práctico:

>>> n = 2
>>> listo = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> split_list = [listo[i:i+n] for i in range(0, len(listo), n)]
>>> split_list
[[1, 2], [3, 4], [5, 6], [7, 8], [9]]

>>> listo = '123456789'
>>> split_list = [listo[i:i+n] for i in range(0, len(listo), n)]
>>> split_list
['12', '34', '56', '78', '9']
9
Community 23 may. 2017 a las 12:33

Aunque esta pregunta se ha publicado después de 4 años, aquí hay otra forma de hacerlo { {X0}} módulo. Del documento:

textwrap.wrap(text[, width[, ...]])

Envuelve el párrafo individual en texto (una cadena) para que cada línea tenga como máximo caracteres de ancho. Devuelve una lista de líneas de salida, sin nuevas líneas finales.

Los argumentos opcionales de palabras clave corresponden a los atributos de instancia de TextWrapper, documentados a continuación. ancho predeterminado a 70.

Entonces podemos hacerlo así:

>>> import textwrap
>>> myList = ['111111111122222222223333333333']

>>> [i for text in myList for i in textwrap.wrap(text, 10)]
['1111111111', '2222222222', '3333333333']

>>> for i in [i for text in myList for i in textwrap.wrap(text, 10)]:
...     print i
1111111111
2222222222
3333333333
>>> 
1
Kevin Guan 4 nov. 2015 a las 05:58

Uso:

value = '111111111122222222223333333333'
n = 10
(value[i:i+n] for i in xrange(0, len(value), n))
1
Artsiom Rudzenka 16 jun. 2011 a las 13:09

Otras formas de hacerlo de forma recursiva:

Opción 1: Función recursiva

>>> def chunks(x, n=10):
...      if len(x) <= n:
...          return [x]
...      else:
...          return [x[:n]] + chunks(x.replace(x[:n], ''))
...
>>> seq = ['111111111122222222223333333333']
>>> print chunks(seq[0])
['1111111111', '2222222222', '3333333333']

Opción 2: Recursiva lambda

>>> n = 10
>>> chunks = lambda x: [x] if len(x) <= n else [x[:n]] + chunks(x.replace(x[:n], ''))
>>> print chunks(seq[0])
['1111111111', '2222222222', '3333333333']
0
Aziz Alto 4 nov. 2015 a las 06:51