2011-04-19 25 views
11

Estoy usando Python para programar para el laboratorio en el que trabajo. ¿Cómo puedo dividir cada 3 caracteres en una cadena dada y anexarla a una lista?¿Cómo puedo cortar una cadena cada 3 índices?

es decir XXXxxxXXXxxxXXXxxxXXXxxxXXX (donde X o X es cualquier letra dada)

string = 'XXXxxxXXXxxxXXXxxxXXXxxxXXX' 
mylist = [] 

for x in string: 
    string[?:?:?] 
    mylist.append(string) 

quiero la lista para tener este aspecto: [ 'XXX', 'xxx', 'XXX', 'xxx',' XXX '.... etc]

¿Alguna idea?

+2

ah, codones =))) – ninjagecko

+3

Esto es muy similar a [iterar sobre una lista en fragmentos] (http://stackoverflow.com/questions/434287/what-is-the-most-pythonic-way-to -iterate-over-a-list-in-chunks) - revisa las respuestas para algunos excelentes enfoques. –

Respuesta

19

En resumen, no se puede.

En más largo, tendrá que escribir su propia función, posiblemente:

def split(str, num): 
    return [ str[start:start+num] for start in range(0, len(str), num) ] 

Por ejemplo:

 
>>> split("xxxXXX", 3) 
['xxx', 'XXX'] 
>>> split("xxxXXXxx", 3) 
['xxx', 'XXX', 'xx'] 
4

Por lo que yo sé que no se construye en el método que permite para cortar una str cada x índices. Sin embargo, esto debe funciona:

str = "stringStringStringString" 

def chunk_str(str, chunk_size): 
    return [str[i:i+chunk_size] for i in range(0, len(str), chunk_size)] 

chunk_str(str,3) 

produce:

['str', 'ing', 'Str', 'ing', 'Str', 'ing', 'Str', 'ing'] 
+0

ni siquiera el método .split()? – Francis

+0

No, el método '.split' es solo para dividir en función de los caracteres. –

+0

Esta es de lejos la mejor solución que he encontrado. ¡Gran trabajo! –

7

una diferencia entre las listas de división en trozos de 3 y cadenas en trozos de 3 es que el módulo re funciona con cadenas en lugar de las listas.

Si el rendimiento es importante (es decir, va a dividir miles de cuerdas), debe probar cómo las diversas respuestas se comparan en su aplicación

>>> import re 
>>> re.findall('...','XXXxxxXXXxxxXXXxxxXXXxxxXXX') 
['XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX'] 

>>> chunksize=3 
>>> re.findall('.{%s}'%chunksize,'XXXxxxXXXxxxXXXxxxXXXxxxXXX') 
['XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX', 'xxx', 'XXX'] 

Esto funciona porque . significa "cualquier carácter" en las expresiones regulares.
.{3} significa "coincide con cualquiera de los 3 personajes", y así sucesivamente

1

Copia de una respuesta de How do you split a list into evenly sized chunks in Python? desde nov 2008:

Directamente desde la documentación de Python (recetas para itertools):

from itertools import izip, chain, repeat 

def grouper(n, iterable, padvalue=None): 
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')" 
    return izip(*[chain(iterable, repeat(padvalue, n-1))]*n) 

Un toma alternativa, como lo sugiere JFSebastian:

from itertools import izip_longest 

def grouper(n, iterable, padvalue=None): 
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')" 
    return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue) 

Creo que ti de Guido La máquina funciona, trabajó, funcionará, habrá funcionado, estaba funcionando nuevamente.

Cuestiones relacionadas