<p>与其编写函数来查找整数列表中所有数字的因子,不如先编写一个函数来查找一个数的因子:</p>
<pre><code>def factor(n):
factors = set()
for x in range(1, int(n**0.5) + 1):
if n % x == 0:
factors.add(x)
factors.add(n//x)
return sorted(factors)
</code></pre>
<p>现在您可以找到单个数字的因子,可以使用<a href="https://docs.python.org/3.5/library/functions.html#map" rel="nofollow">^{<cd1>}</a>将其应用于数字列表:</p>
^{pr2}$
<p>或者,您可以使用列表理解:</p>
<pre><code>[factor(n) for n in [4, 12, 15]]
</code></pre>
<p>这两种方法都返回以下值:</p>
<blockquote>
<p>[[1, 2, 4], [1, 2, 3, 4, 6, 12], [1, 3, 5, 15]]</p>
</blockquote>
<p>如果您愿意,您可以将其中任何一个设为函数:</p>
<pre><code>def factor_list(arr):
return map(factor, arr)
factor_list([4, 12, 15])
</code></pre>
<p>如您所见,将最初的问题从求一组数的因子分解到求一个数的因子,可以使整个问题变得更简单,解决方案也更简单。在</p>
<h2>编辑1</h2>
<p><em>下面是我为什么根据OP的请求使用<code>n//x</code>而不是仅仅使用<code>n/x</code>。</em></p>
<p><code>//</code>是Python中的<a href="https://docs.python.org/3.5/glossary.html#term-floor-division" rel="nofollow">floor division</a>运算符。它本质上相当于将两个数除以,然后调用商的<a href="https://docs.python.org/3.5/library/math.html#math.floor" rel="nofollow">^{<cd5>}</a>。我们需要这样做是因为<code>n/x</code>将使用“真除法”,正如您所说,它返回一个浮点。因为我们在寻找整数因子,所以只有强制数字为整数才有意义。在</p>
<p>如果您真的愿意,可以用您在问题中使用的算法替换我的<code>factor</code>函数,而不必更改程序的行为:</p>
<pre><code>def factor(i):
result = []
for j in range(1, i+1):
if i % j == 0:
result.append(j)
return result
</code></pre>
<p>或者,更短的等价物:</p>
<pre><code>def factor(i):
return [j for j in range(1, i+1) if i % j == 0]
</code></pre>
<p>但是,我使用的算法更有效,因为它只需要检查直到被分解的数字的平方根。在</p>
<h2>编辑2</h2>
<p>我从其他一些答案中看出,你可能在寻找最短的解决方案:</p>
<pre><code>fn=lambda a:map(lambda i:[j for j in range(1, i+1)if i%j==0],a)
</code></pre>
<p>我相信我能用上面的,63个字符的一行字来获胜:)。虽然这个解决方案很短,但我相信我的第一个解决方案更好,因为它更具可读性。记住,短并不总是更好!在</p>