簡體   English   中英

使用while循環進行列表理解?

[英]List comprehension using while loop?

有沒有辦法在列表理解中使用 while 循環。

例如,我有一個單行斐波那契生成器:

[int(((1+(5**0.5))**n-(1-(5**0.5))**n)/(2**n*(5**0.5))) for n in range(100)]

但我希望它在某個結果處停止,而不僅僅是運行一定次數。 (即所有低於 4,000,000 的斐波那契數列)

這是一個關於列表理解的問題,而不是一般的列表。

更通用的措辭可能是這樣的:

[(formula using incrementing variable) 
    for incrementing variable while (result is less than specified amount)]

python 沒有在理解中使用while功能(就像地圖與過濾器相結合),但是您可以使用其他工具來實現這一點,例如制作一個可以做您想要的功能或使用您最好的朋友itertools模塊。 例如

示例 1,使用 itertools

>>> from itertools import takewhile
>>> def fib():
        fk,fk1 = 0,1
        while True:
            yield fk
            fk, fk1 = fk1, fk + fk1


>>> list(takewhile(lambda fn:fn<100,fib()))
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> 

例子2,帶函數

>>> def fib_while(tope):
        fk,fk1 = 0,1
        while fk < tope:
            yield fk
            fk,fk1 = fk1, fk + fk1


>>> list(fib_while(100))
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>>    

哦,我忘了提,但是您獲取斐波那契數的公式,即使數學正確,也注定無法獲得足夠大的 n 的真實值,因為浮點算術舍入錯誤

分歧點很容易找到(使用上面的fib

>>> def fib_float(n):
        return int(((1+(5**0.5))**n-(1-(5**0.5))**n)/(2**n*(5**0.5)))

>>> [n for n,f in zip(range(100),fib()) if f!=fib_float(n)] )
[72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>>

所以對於所有 n>=72 你得到的不是斐波那契數...

如果您只關心序列中 4,000,000 以下的所有數字,那么這當然不是問題,因為限制是 n=33

暫無
暫無

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

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