<p>一般来说,您不想在列表理解中做这种事情——这将导致更难阅读代码。然而,如果你真的必须这样做,我们可以写一个非常可怕的1行:</p>
<pre><code>>>> values = [random.randint(0,10) for _ in xrange(12)]
>>> values
[1, 10, 6, 6, 3, 9, 0, 1, 8, 9, 1, 2]
>>> # This is the 1 liner -- The other line was just getting us a list to work with.
>>> [(lambda x=random.sample(values,3):any(values.remove(z) for z in x) or x)() for _ in xrange(4)]
[[6, 1, 8], [1, 6, 10], [1, 0, 2], [9, 3, 9]]
</code></pre>
<p>请不要使用这个代码——我只是出于好玩/学术的原因才发的。</p>
<p>其工作原理如下:</p>
<p>我在列表理解中创建了一个函数,默认参数是从输入列表中随机选择的3个元素。在函数内部,我将元素从<code>values</code>中移除,这样它们就不能再被拾取。由于<code>list.remove</code>返回<code>None</code>,我可以使用<code>any(lst.remove(x) for x in ...)</code>删除值并返回<code>False</code>。由于<code>any</code>返回<code>False</code>,因此在调用函数时,我们命中了<code>or</code>子句,该子句只返回<code>x</code>(带有3个随机选择项的默认值)。剩下的就是调用函数,让魔法发生。</p>
<p>这里的一个问题是,您需要确保您请求的组数(这里我选择了4)乘以每个组的项数(这里我选择了3)小于或等于输入列表中的值数。这看起来很明显,但无论如何可能值得一提。。。</p>
<p>下面是我将<code>shuffle</code>放入列表理解的另一个版本:</p>
<pre><code>>>> lst = [random.randint(0,10) for _ in xrange(12)]
>>> lst
[3, 5, 10, 9, 10, 1, 6, 10, 4, 3, 6, 5]
>>> [lst[i*3:i*3+3] for i in xrange(shuffle(lst) or 4)]
[[6, 10, 6], [3, 4, 10], [1, 3, 5], [9, 10, 5]]
</code></pre>
<p>这比我的第一次尝试要好得多,但是,大多数人仍然需要停下来,挠挠头,然后才知道这段代码在做什么。我仍然断言,多行这样做会更好。</p>