2014-11-10 3 views
0

Я хочу сгруппировать список строк по «абзацу»; абзацы разделены одной пустой строкой.Группировка строк по параграфу

Следующий код делает то, что я хочу, но я ищу более элегантный синтаксис (например, используя itertools).

txt = ['First paragraph', ' continues', 
     '', 
     'Second ', 'paragraph'] 

para = [[]] 
for ln in txt: 
    if not ln: 
     para.append([]) 
    else: 
     para[-1].append(ln) 

Я на самом деле ищет своего рода group-while функции.

+0

ничего плохого с тем, что вы используете –

+0

@PadraicCunningham: помимо требующих что все абзацы вписываются в память за один раз. :-) Если строки поступают из файла или сетевого сокета, а не из списка, вы можете, например, обработать данные в кусках. –

+0

@MartijnPieters, мы будем говорить много абзацев, прежде чем это будет проблемой –

ответ

2

Вы можете использовать itertools.groupby():

from itertools import groupby 

paragraphs = (list(g) for empty, g in groupby(txt, lambda l: not len(l)) if not empty) 

Это создает генератор, в котором перечислены пункты, путем группировки по длине линии:

>>> from itertools import groupby 
>>> txt = ['First paragraph', ' continues', 
...  '', 
...  'Second ', 'paragraph'] 
>>> paragraphs = (list(g) for empty, g in groupby(txt, lambda l: not len(l)) if not empty) 
>>> for para in paragraphs: 
...  print para 
... 
['First paragraph', ' continues'] 
['Second ', 'paragraph'] 
Смежные вопросы