2017-01-18 13 views
-2

リストの理解にwhileループを使用する方法はありますか?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)] 
+0

この回答を見る:http://stackoverflow.com/questions/31003486/stopping-list-selection- in-python-2-7 –

+0

はい、方法があります。あなたは 'while'ループを書こうとしましたか? – blacksite

+2

リスト内包表記の代わりにジェネレータ式を使用して、ある点までループするか、 'itertools.takewhile()'を使用することができます。 –

答えて

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

すべてのnに対して

>>> 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] 
>>> 

ので(上記fib使用)

発散のポイントが見つかりました。非常に簡単です> = 72あなたは、あなただけの世話場合

...番号をフィボナッチされていません何を得ます4,000,000以下のシーケンス内のすべての数字は、制限がn = 33のようにもちろん問題ではありません。

+0

ええ、私はその範囲を実行し、同様にその問題を認識しました。 ご回答いただきありがとうございます。これは私が探していた答えであり、リスト内包はどんな場合でも特定の結果が出たときに停止する関数を探すのに役立たないということです。 – Sanjurjo7

関連する問題