У меня есть список, который приближается к:
[f(x) for x in l if f(x)]
Где l - список, а f (x) - дорогая функция, которая возвращает список.
Я хочу избежать оценки f (x) дважды для каждого непустого заполнения f (x). Есть ли способ сохранить свой результат в понимании списка?
Я мог бы удалить окончательное условие, сгенерировать весь список и затем обрезать его, но это кажется расточительным.
Edit
Были предложены два основных подхода:
Внутреннее понимание генератора:
[y for y in (f(x) for x in l) if y]
или memoization.
Я думаю, что внутреннее понимание генератора элегантно для проблемы, как указано. На самом деле я упростил вопрос, чтобы дать понять, я действительно хочу:
[g(x, f(x)) for x in l if f(x)]
Для этой более сложной ситуации, я думаю, memoization дает более чистый конечный результат.