<p>解决这个问题的简单方法是分两步进行:首先,将其分解为3元组列表。然后,将其分解为两个列表。你知道吗</p>
<p>每个步骤有两种方法。你知道吗</p>
<hr/>
<p>第一种是使用切片和测距:</p>
<pre><code>>>> li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
>>> [li[i:i+3] for i in range(0, len(li), 3)]
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18]]
</code></pre>
<p>但我们需要3元组,而不是3列表,因此需要在表达式周围添加<code>tuple()</code>:</p>
<pre><code>>>> li_3 = [tuple(li[i:i+3]) for i in range(0, len(li), 3)]
</code></pre>
<p>然后,我们再做同样的事情:</p>
<pre><code>>>> li_23 = [li_3[i:i+2] for i in range(0, len(li_3), 2)]
</code></pre>
<hr/>
<p>另一种方法是将相同的迭代器压缩到自身。文档中的<a href="http://docs.python.org/2/library/itertools.html#recipes" rel="nofollow">^{<cd2>} recipes</a>展示了如何做到这一点。事实上,我们只要复制并粘贴食谱,然后我们就可以使用它了。你知道吗</p>
<pre><code>>>> from itertools import izip_longest
>>> def grouper(iterable, n, fillvalue=None):
... "Collect data into fixed-length chunks or blocks"
... # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
... args = [iter(iterable)] * n
... return izip_longest(fillvalue=fillvalue, *args)
</code></pre>
<p>现在:</p>
<pre><code>>>> li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
>>> grouper(li, 3)
<itertools.zip_longest at 0x10467dc00>
</code></pre>
<p>它给了我们一个迭代器;我们必须把它转换成一个列表来查看元素:</p>
<pre><code>>>> list(grouper(li, 3))
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18]]
</code></pre>
<p>所以,现在我们重复同样的步骤:</p>
<pre><code>>>> list(grouper(grouper(li, 3), 2))
[((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12)), ((13, 14, 15), (16, 17, 18))]
</code></pre>
<p>但是我们得到的是元组的元组,我们需要元组的列表,所以:</p>
<pre><code>>>> li_23 = [list(group) for group in grouper(grouper(li, 3), 2)]
</code></pre>
<hr/>
<p>在Python中,应该有一种也是唯一一种明显的方法来做事情。那么,是哪一个?你知道吗</p>
<ul>
<li>第一个需要一个列表或其他序列;第二个需要任何iterable。你知道吗</li>
<li>如果在末尾有剩余值,第一个值将给出一个部分组;第二个值将填充最后一个组。你知道吗</li>
<li>第二种方法很容易修改,删除不完整的最后一个组而不是填充它,并且不太难修改,从而得到一个部分组;第一种方法更难修改。你知道吗</li>
<li>第一个对于新手来说更容易理解,但是一旦你理解了这个概念,可能就更难阅读了。你知道吗</li>
<li>其中一个可以很容易地包装在函数中,但是第二个已经包装在recipes(或者<code>more_itertools</code>第三方包)中。你知道吗</li>
</ul>
<p>这些差异中的一个通常对您的用例很重要,在这种情况下,显而易见的方法就是做您想做的事情。对于像这样的简单案例,如果这些都无关紧要的话…就做你觉得更可读的那个。你知道吗</p>