2009-01-21 7 views
8

Estoy buscando tomar una cadena y crear una lista de cadenas que crean la cadena original.python: enumerar las tácticas de comprensión

ej .:

"asdf" => ["a", "as", "asd", "asdf"] 

Estoy seguro de que hay una manera "Pythonic" para hacerlo; Creo que estoy perdiendo la cabeza. ¿Cuál es la mejor manera de hacer esto?

Respuesta

19

Una posibilidad:

>>> st = 'asdf' 
>>> [st[:n+1] for n in range(len(st))] 
['a', 'as', 'asd', 'asdf'] 
+0

+1 ¡guau! aprende algo nuevo todos los días :) –

+0

Ten cuidado al usar esto en cualquier cosa que no sean cuerdas muy cortas. ¡Una cadena de 300 caracteres generaría una lista de 300 elementos que contiene 45.150 caracteres! –

+6

Un punto menor, pero usaría xrange() en lugar de range(), ya que no es necesario crear la lista de enteros: >>> x = "asdf" >>> [x [: n] para n en xrange (1, len (x) +1)] ['a', 'as', 'asd', 'asdf'] – user26294

17

Si vas a ser un bucle a través de los elementos de su "lista", puede ser mejor usar un generador en lugar de lista por comprensión:

>>> text = "I'm a little teapot." 
>>> textgen = (text[:i + 1] for i in xrange(len(text))) 
>>> textgen 
<generator object <genexpr> at 0x0119BDA0> 
>>> for item in textgen: 
...  if re.search("t$", item): 
...   print item 
I'm a lit 
I'm a litt 
I'm a little t 
I'm a little teapot 
>>> 

Este código nunca crea un objeto de lista, ni nunca (colección de basura delta) crea más de una cadena adicional (además de text).

+0

+1, me gusta el uso de un generador sobre la marcha. –

+2

Tenga en cuenta que obtiene los mismos beneficios de forma mucho más simple con un bucle simple: "para n en xrange (len (texto)): do_something_with (text [: n + 1])" –

+0

@dF: Eso también. :-) –

Cuestiones relacionadas