列表理解与多个任务

时间:2015-01-27 18:44:24

标签: python list python-2.7 nested-lists

我现在有这个代码用于分解大数字:

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]

那样我没有嵌套列表。它会更快,速度是最重要的。

我查看了文档,但找不到多个分配的单个示例。

3 个答案:

答案 0 :(得分:1)

使用itertools.chain

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]