2009-01-21 7 views
8

Je cherche à prendre une chaîne et à créer une liste de chaînes qui construisent la chaîne d'origine. manièrepython: tactique de compréhension de liste

.: par exemple

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

Je suis sûr qu'il ya un "pythonique" de le faire; Je pense que je perds juste la tête. Quelle est la meilleure façon d'y arriver?

Répondre

19

Une possibilité:

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

+1 wow! apprendre quelque chose de nouveau tous les jours :) –

+0

Soyez prudent lorsque vous utilisez ceci sur autre chose que des chaînes très courtes. Une chaîne de 300 caractères génèrerait une liste de 300 éléments contenant 45 150 caractères! –

+6

Un point mineur, mais j'utiliserais xrange() au lieu de range(), puisque vous n'avez pas besoin de créer la liste des entiers: >>> x = "asdf" >>> [x [: n] pour n dans xrange (1, len (x) +1)] ['a', 'as', 'asd', 'asdf'] – user26294

17

Si vous allez être en boucle sur les éléments de votre « liste », vous pouvez être mieux d'utiliser un générateur plutôt que la compréhension de la liste:

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

Ce code ne crée jamais d'objet liste, et ne crée jamais plus d'une chaîne supplémentaire (en plus de text).

+0

+1, j'aime l'utilisation d'un générateur à la volée. –

+2

Notez que vous obtenez les mêmes avantages beaucoup plus simplement avec un simple pour loop-- "pour n dans xrange (len (texte)): do_something_with (texte [: n + 1])" –

+0

@dF: Cela, aussi. :-) –