2009-01-21 19 views
8

Bir dize alıp orijinal dizeyi oluşturan dizelerin bir listesini oluşturmaya çalışıyorum.python: liste anlama taktikleri

ör .: bunu yapmak için bir "pythonic" yolu yoktur eminim

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

; Sanırım sadece aklımı kaybediyorum. Bunu yapmanın en iyi yolu nedir?

cevap

19

Bir olasılık:

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

+1 Vay canına! Her gün yeni bir şey öğrenmek :) –

+0

Bunu çok kısa dizelerden başka bir şey üzerinde kullanırken dikkatli olun. 300 karakterli bir dize, 45,150 karakterden oluşan 300 öğeli bir liste oluşturur! –

+6

Küçük bir nokta, ancak tamsayıların listesini oluşturmanıza gerek olmadığından xrange() range() yerine kullanacağım: >>> x = "asdf" >>> [x [: n] xrange (1, len (x) +1)] için ['a', 'as', 'asd', 'asdf'] – user26294

17

size "listesinde" unsurları üzerinde döngü olacak ediyorsanız, yerine liste anlama daha jeneratörü kullanarak daha iyi olabilir:

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

Bu kod hiçbir zaman bir liste nesnesi oluşturmaz ve ne de (delta çöp toplama) bir fazladan fazla dize yaratmaz (text'a ek olarak).

+0

+1, bir on-the-fly jeneratörünün kullanımını severim. –

+2

Aynı faydaları basit bir döngü ile daha basit bir şekilde elde edeceğinizi unutmayın - "xrange in xrange (len (metin)): do_something_with (text [: n + 1])" –

+0

@dF: Bu da. :-) –