2011-06-16 17 views
6

Estoy realmente atrapado en una pregunta básica. Estoy tratando de tener una lista de un solo elemento y se divide en una lista de muchos elementos, cada uno con una longitud charater de 10. Por ejemplo dar una lista con un artículo, ['111111111122222222223333333333'], la salida produciría:cómo analizar una lista o una cadena en trozos de longitud fija

1111111111 
2222222222 
3333333333 

Siento que esto es súper 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? ¿Sería más fácil usar una cadena que una lista?

+0

puede reformular esto por favor: 'Estoy tratando de recorrer una lista de n longitud en sublistas de 10 characters.' i no lo entiendo. – mouad

+0

@mouad editado para mayor claridad, espero que haya sido de ayuda. – drbunsen

+0

Editar título para deletrear. Además, su cadena no necesita estar dentro de una lista. Además, ¿ya no respondí tu pregunta? (ver a continuación) –

Respuesta

9

Una cuestión relacionada se ha preguntado: Slicing a list into a list of sub-lists

Por ejemplo, si su lista de fuentes es:

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

puede dividirlo gusta:

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

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

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

A continuación, puede iterar a través de él como:

for sub_list in split_list: 
    # Do something to the sub_list 

Lo mismo vale para las cadenas.

Aquí está 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'] 
+0

gracias, eso era exactamente lo que necesitaba. ¡tu ayuda es muy apreciada! – drbunsen

1

Uso:

value = '111111111122222222223333333333' 
n = 10 
(value[i:i+n] for i in xrange(0, len(value), n)) 
1

Aunque esta cuestión se ha publicado después de 4 años, pero aquí es una otra manera de hacer este uso textwrap module. Del documento:

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

envuelve el párrafo único en el texto (una cadena) por lo que cada línea de caracteres es como máximo de ancho de largo. Devuelve una lista de líneas de salida, sin nuevas líneas finales.

Los argumentos de palabra clave opcionales corresponden a los atributos de instancia de TextWrapper, que se documentan a continuación. el ancho predeterminado es 70.

Así que podemos hacerlo de esta manera:

>>> 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 
>>> 
0

Otras maneras 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: Recursivo 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'] 
Cuestiones relacionadas