有没有办法在列表解析中使用while循环。
例如,我有一行Fibonacci生成器:
[int(((1+(5**0.5))**n-(1-(5**0.5))**n)/(2**n*(5**0.5))) for n in range(100)]
但我希望它停止在某个结果,而不是只运行一定次数。 (即所有Fibonacci序列号低于4,000,000)
这是一个关于列表理解的问题,而不是一般的列表。
更通用的措辞可能是这样的:
[(formula using incrementing variable)
for incrementing variable while (result is less than specified amount)]
答案 0 :(得分:0)
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的真实值,因为floating point arithmetic rounding errors
很容易找到分歧点(使用上面的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&gt; = 72,你得到的不是斐波纳契数......
如果您只关心4,000,000以下序列中的所有数字,那么这当然不是问题,因为限制是n = 33