<p>编辑:</p>
<p>你想要的是一个可以反复迭代的东西,但它直到尽可能晚才起作用。这不是一个列表,所以列表理解是错误的工具。幸运的是,您可以使用<em>生成器表达式</em>。您的代码非常复杂,因此我们可能希望使用标准库中定义的一些helper,在<code>itertools</code>中。在</p>
<p>让我们从零件的一般情况开始:</p>
<pre><code>[n
for x0 in range(10)
for x1 in range(10)
...
for xn in range(10)
if x0 * x1 * ... * xn == input]
</code></pre>
<p>我们有三个部分要概括。我们将从嵌套的for循环开始,作为N的参数。为此,我们将使用<code>itertools.product</code>,它接受一个序列序列,类似于<code>[range(10), range(10), ... , range(10)]</code>,并从这些序列中产生所有可能的项组合。在多次循环一个序列的特殊情况下,您可以将嵌套深度作为<code>repeat</code>传递,这样我们就可以得到:</p>
^{pr2}$
<p>对于输出中的和,我们可以用<code>sum()</code>将其展平为一个值,对于乘积,实际上没有等效值。我们可以用<code>reduce</code>和一个将两个数字相乘的函数,我们可以从另一个标准库中得到这个函数:<code>operator.mul</code>:</p>
^{3}$
<p>我们只需要把这个序列的一个很好的序列变成一个连续的序列</p>
<pre><code>itertools.chain.from_iterable(
(n
for x in itertools.product(xrange(10), repeat=n)
if reduce(operator.mul, x, 1) == input)
for n in itertools.count(1)
if 2 ** n > input))
</code></pre>
<pre><code>In [32]: input = 32
In [33]: next(itertools.chain.from_iterable(
(n
for x in itertools.product(xrange(10), repeat=n)
if reduce(operator.mul, x, 1) == input)
for n in itertools.count(1) if 2 ** n > input))
Out[33]: 6
</code></pre>