Python itertools groupby没有像我预期的那样分组

Python itertools groupby没有像我预期的那样分组,python,list,itertools,Python,List,Itertools,假设我有这样一个字符串: st='''Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10 Line 11 Line 12 Line 13 Line 14''' # may be really big... 现在假设我想要一个由空白行分组的LOL: [['Line 1', 'Line 2', 'Line 3', 'Line 4'], ['Line 5', 'Line 6'], ['Line 7'

假设我有这样一个字符串:

st='''Line 1
Line 2
Line 3
Line 4

Line 5
Line 6

Line 7
Line 8 
Line 9

Line 10
Line 11
Line 12
Line 13
Line 14'''
# may be really big...

现在假设我想要一个由空白行分组的LOL:

[['Line 1', 'Line 2', 'Line 3', 'Line 4'],
 ['Line 5', 'Line 6'],
 ['Line 7', 'Line 8 ', 'Line 9'],
 ['Line 10', 'Line 11', 'Line 12', 'Line 13', 'Line 14']]
我知道我可以通过正则表达式拆分创建LoL:

[[x] for x in re.split(r'^\s*\n',st,flags=re.MULTILINE)]
然而,我试图用一个非正则Python生成器来创建它。我得到的最接近的是这个可怕的东西(包括空格,我知道它根本没有效率……):

有什么方向的提示吗


我有点紧张。

这对你不起作用有什么原因吗

>>> lol = [group.split("\n") for group in st.split("\n\n")]
>>> pprint(lol)
[['Line 1', 'Line 2', 'Line 3', 'Line 4'],
 ['Line 5', 'Line 6'],
 ['Line 7', 'Line 8 ', 'Line 9'],
 ['Line 10', 'Line 11', 'Line 12', 'Line 13', 'Line 14']]

这对你不起作用有什么原因吗

>>> lol = [group.split("\n") for group in st.split("\n\n")]
>>> pprint(lol)
[['Line 1', 'Line 2', 'Line 3', 'Line 4'],
 ['Line 5', 'Line 6'],
 ['Line 7', 'Line 8 ', 'Line 9'],
 ['Line 10', 'Line 11', 'Line 12', 'Line 13', 'Line 14']]
我可能会写信

>>> grouped = itertools.groupby(map(str.strip, st.splitlines()), bool)
>>> [list(g) for k,g in grouped if k]
[['Line 1', 'Line 2', 'Line 3', 'Line 4'], ['Line 5', 'Line 6'], 
['Line 7', 'Line 8', 'Line 9'], ['Line 10', 'Line 11', 'Line 12', 'Line 13', 'Line 14']]
这还将处理带有空格的空行,而基于
\n\n
的拆分将不会这样做。另一方面,它不保留前导和尾随空格,这是您可能需要的
“第8行”
示例中的空格。如果这很重要,你可以:

grouped = itertools.groupby(st.splitlines(), lambda x: bool(x.strip()))
(仔细看,这与你已经在做的事情非常接近。)

我可能会写

>>> grouped = itertools.groupby(map(str.strip, st.splitlines()), bool)
>>> [list(g) for k,g in grouped if k]
[['Line 1', 'Line 2', 'Line 3', 'Line 4'], ['Line 5', 'Line 6'], 
['Line 7', 'Line 8', 'Line 9'], ['Line 10', 'Line 11', 'Line 12', 'Line 13', 'Line 14']]
这还将处理带有空格的空行,而基于
\n\n
的拆分将不会这样做。另一方面,它不保留前导和尾随空格,这是您可能需要的
“第8行”
示例中的空格。如果这很重要,你可以:

grouped = itertools.groupby(st.splitlines(), lambda x: bool(x.strip()))

(从外观上看,这与您已经在做的事情非常接近。)

这很好(+1),但我希望的是一种通用的蛹发生器。参见问题的编辑。这很好(+1),但我希望的是一种通用的蛹发生器。请参见问题的编辑。顺便说一句,您的最终循环可以简化为
[itertools中的组的列表(组)。groupby(st.splitlines(),lambda x:not x.rstrip())]
。顺便说一句,您的最终循环可以简化为
[itertools中的组的列表(组)。groupby(st.splitlines(),lambda x:not x.rstrip())]
.Drak!(头巾)这是我缺少的第二个理解力(
[列表(g)表示k,如果k,则分组为g]
)!谢谢德拉克!(头巾)这是我缺少的第二个理解力(
[列表(g)表示k,如果k,则分组为g]
)!谢谢