我现在有这个代码用于分解大数字:
def f1(n):
return [[i, n//i] for i in range(1 , int(n**0.5) + 1) if n % i == 0]
这是迄今为止我见过的最快的版本(如果有更快的方式我也想知道这一点),但是我想要一个没有嵌套的所有因素的列表(所以我想要类似于:[factor 1, factor 2, factor 3,..., factor n-3, factor n-2, factor n-1, factor n]
等等。订单并不重要。
因此我想知道是否有办法通过列表理解来归因多个作业。
即
def f1(n):
return [i, n//i for i in range(1 , int(n**0.5) + 1) if n % i == 0]
那样我没有嵌套列表。它会更快,速度是最重要的。
我查看了文档,但找不到多个分配的单个示例。
答案 0 :(得分:1)
from itertools import chain
def f1(n):
return list(chain.from_iterable([i, n//i] for i in xrange(1 , int(n**0.5) + 1) if not n % i))
如果您不需要列表,请删除链上的列表调用,然后迭代返回的链对象。
如果优化很重要,你应该使用extend和xrange:
def f1(n):
l = []
for i in xrange(1, int(n**0.5)+1):
if not n % i:
l.extend((i,n//i))
return l
答案 1 :(得分:1)
列表理解很好,但有时它们不是最好的解决方案,取决于可读性和速度的要求。有时,只写出隐含的for循环(和if语句)更具可读性和更快。
def factors(n):
l = []
for i in range(1, int(n**0.5)+1):
if n % i == 0:
l.append(i)
l.append(n//i)
return l
对于小数字,上述功能比列表理解更快。在较大的数字(1,000,000和更大),功能和列表理解在速度方面是相同的。
为了略微提高速度,您还可以缓存列表的append方法,但这会使函数的可读性略低。
def factors(n):
l = []
append = l.append
for i in range(1, int(n**0.5)+1):
if n % i == 0:
append(i)
append(n//i)
return l
速度比较:
In [86]: %timeit factors_list_comprehension(1000)
100000 loops, best of 3: 7.57 µs per loop
In [87]: %timeit factors_function(1000)
100000 loops, best of 3: 6.24 µs per loop
In [88]: %timeit factors_optimised_function(1000)
100000 loops, best of 3: 5.81 µs per loop
In [89]: %timeit factors_list_comprehension(1000000)
10000 loops, best of 3: 111 µs per loop
In [90]: %timeit factors_function(1000000)
10000 loops, best of 3: 108 µs per loop
In [91]: %timeit factors_optimised_function(1000000)
10000 loops, best of 3: 106 µs per loop
答案 2 :(得分:0)
您可以使用sum()获得所需的结果。例如:
>>> sum([[1,6],[2,3]],[])
[1, 6, 2, 3]
我们可以根据您现有的代码定义答案:
def f2(n):
return sum(f1(n), [])
但是,当n
是一个完美的正方形时,请注意你的代码返回平方根两次:
>>> f1(9)
[[1, 9], [3, 3]]
>>> f2(9)
[1, 9, 3, 3]