[英]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.