<p>如果您试图将内容收集成4行一组,<a href="http://docs.python.org/3/library/itertools.html#recipes" rel="nofollow">^{<cd2>} recipes</a>中的<code>grouper</code>函数使其变得微不足道:</p>
<pre><code>groups = grouper(4, file)
</code></pre>
<p>这将返回iterable的iterable,尤其是<code>izip</code>lazy iterator over <code>tuple</code>s。如果您特别需要列表列表,则需要执行以下操作:</p>
^{pr2}$
<p>由于配方不是标准库模块的一部分,您要么从文档中复制并粘贴函数,要么安装一个名为<a href="https://pypi.python.org/pypi/more-itertools" rel="nofollow">^{<cd5>}</a>的第三方模块。在</p>
<p>如果你想要一些稍有不同的东西…好吧,在不知道你想要什么的情况下,很难确切地知道如何编码它,但是你可能会在<code>itertools</code>中找到它。在</p>
<p>例如,假设您希望将其拆分为由空白行分隔的组。我很确定<code>more_itertools</code>中有一个函数可以为您完成这项工作,但是您可以很容易地自己编写一个函数。在</p>
<p>首先,可以使用<a href="http://docs.python.org/3/library/itertools.html#itertools.groupby" rel="nofollow">^{<cd8>}</a>根据行是否都是空白来分组:</p>
<pre><code>groups = itertools.groupby(file, lambda line: not line.strip())
</code></pre>
<p>但是<code>groupby</code>返回<code>key, group</code>对。您只需要<code>group</code>而不需要<code>key</code>。你也只需要非空行的组,而不是所有的组。在</p>
<pre><code>groups = [group for empty, group
in itertools.groupby(file, lambda line: not line.strip())
if not empty]
</code></pre>
<p>或者,如果您显式需要一个列表列表,而不是某个任意的iterable类型(在本例中,是<code>_grouper</code>lazy iterables的列表):</p>
<pre><code>groups = [list(group) for empty, group
in itertools.groupby(file, lambda line: not line.strip())
if not empty]
</code></pre>
<p>如果您看一下<code>groupby</code>文档,这些示例实际上非常接近于此。在</p>
<p>我可能会把<code>lambda line: not line.strip()</code>分解成一个函数(或者使用<code>more_functools.negate(line.strip)</code>,或者…),然后把它写成两行或三行,而不是把它塞进一个大的列表理解中,但是如果你想要一个1行的列表理解(98个字符的行是可以接受的),这就是它。在</p>