簡體   English   中英

具有多個任務的列表理解

[英]list comprehension with multiple assignments

我目前有這段代碼可以分解大量數字:

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]

這樣,我就沒有嵌套列表。 它將更快並且速度至關重要。

我查看了文檔,找不到多個分配的單個示例。

使用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

列表理解能力很好,但有時並不是最佳解決方案,具體取決於可讀性和速度要求。 有時,僅寫出隱含的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

您可以使用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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM