2017-01-18 3 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

питона не имеет такую ​​особенность использования 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] 
>>> 

так что для всех п> = 72, что вы получаете не числами Фибоначчи ...

, если вы заботитесь только для все числа в последовательности ниже 4 000 000, то это, конечно, не проблема, так как предел равен n = 33

+0

Да, я запустил этот диапазон и понял эту проблему. Спасибо за рассмотренный ответ. Это тот ответ, который я искал, что понимание списка не будет полезным в любом случае для поиска функции, которая остановится при появлении определенного результата. – Sanjurjo7

Смежные вопросы