Взлом, на который ссылается Лоуренс:
Вы можете сделать это в одном понимании списка, это просто заканчивается УДОВОЛЬСТВЕННЫМ питоном. Нечитаемый питон. Страшный питон. Я только представляю следующее как любопытство, а не как фактический ответ. Не делайте этого в коде, который вы на самом деле хотите использовать, только если вы хотите поиграть с внутренней работой на python.
Итак, 3 подхода:
Список помощи 1
1: Используя список помощи, ответ заканчивается в списке помощи. Это добавляет значения в список, который повторяется до тех пор, пока вы не достигнете значения, на котором хотите остановиться.
A = [10]
print [None if A[-1] == 1
else A.append(A[-1]/2) if (A[-1]%2==0)
else A.append(3*A[-1]+1)
for i in A]
print A
результат:
[None, None, None, None, None, None, None]
[10, 5, 16, 8, 4, 2, 1]
Список помощи 2
2: Использование списка помощи, но с результатом, являющимся результатом понимания списка. В основном это зависит от list.append(...)
, возвращающего None
, not None
с оценкой True
и True
, считающейся 1
для целей арифметики Вздох.
A=[10]
print [A[0]*(not A.append(A[0])) if len(A) == 1
else 1 if A[-1] == 2 else (A[-1]/2)*(not A.append(A[-1]/2)) if (A[-1]%2==0)
else (3*A[-1]+1)*(not A.append(3*A[-1]+1))
for i in A]
результат:
[10, 5, 16, 8, 4, 2, 1]
Ссылка на понимание списка изнутри
3: Не использовать список помощи, а возвращаться к пониманию списка по мере его создания. Это немного хрупко, и, вероятно, не будет работать во всех средах. Если это не работает, попробуйте запустить код самостоятельно:
from itertools import chain, takewhile
initialValue = 10
print [i if len(locals()['_[1]']) == 0
else (locals()['_[1]'][-1]/2) if (locals()['_[1]'][-1]%2==0)
else (3*locals()['_[1]'][-1]+1)
for i in takewhile(lambda x:x>1, chain([initialValue],locals()['_[1]']))]
результат:
[10, 5, 16, 8, 4, 2, 1]
Итак, теперь забудьте, что вы читали это. Это темный, темный и грязный питон. Злой питон. И мы все знаем, что питон не злой. Питон милый и приятный. Так что вы не могли прочитать это, потому что такого рода вещи не могут существовать. Хорошо хорошо.