2009-01-21 6 views
8

Я ищу, чтобы взять строку и создать список строк, которые создают исходную строку.python: Тактика понимания тайтлов

.: например

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

Я уверен, что есть "вещий" способ сделать это; Кажется, я просто схожу с ума. Каков наилучший способ сделать это?

ответ

19

Одним из возможных вариантов:

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

+1 ничего себе! узнайте что-нибудь новое каждый день :) –

+0

Будьте осторожны при использовании этого на чем-то другом, кроме очень коротких строк. 300-символьная строка будет генерировать список из 300 элементов, содержащий 45 150 символов! –

+6

Небольшая точка, но я бы использовал xrange() вместо range(), так как вам не нужно создавать список целых чисел: >>> x = "asdf" >>> [x [: n] для n в xrange (1, len (x) +1)] ['a', 'as', 'asd', 'asdf'] – user26294

17

Если вы собираетесь быть зацикливание по элементам вашего «список», вы можете быть лучше использовать генератор, а не список понимания:

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

Этот код никогда не создает объект списка, и он никогда (сборка мусора delta) не создает более одной дополнительной строки (в дополнение к text).

+0

+1, мне нравится использование генератора «на лету». –

+2

Обратите внимание, что вы получаете те же преимущества гораздо проще с помощью простого цикла: «для n в xrange (len (text)): do_something_with (текст [: n + 1])» –

+0

@dF: Это тоже. :-) –

Смежные вопросы