Знаете, ваше лучшее решение - просто инициализировать secondList, как вам нравится, и выполнять все три функции в обычном цикле, поскольку все они зависимы и содержат логику, которая не просто фильтрует (вы говорите, что процесс устанавливает атрибуты. .. Я предполагаю, что вы имеете в виду, кроме отбросить):
# If secondList not initialized...
secondList = []
for x in firstList:
firstFunc(x)
secondFunc(x)
process(x)
if not x.discard:
secondList.append(x)
Понятия списков здесь не сильно помогают, так как вы выполняете обработку каждой функции (хотя они отнимают одну или две строки; зависит от того, что вы ищете в «чистом» коде). Если бы весь процесс () возвращал значение «Истина», если элемент должен быть в новом списке, и значение «Ложь», если элемент не должен быть в новом списке, то приведенное ниже будет действительно лучше, ИМО.
Если firstFunc (x) и secondFunc (x) действительно изменяют результат x.discard после process (), а результат process (x) равен просто x, я бы сделал следующее в вашей ситуации:
for x in firstList:
firstFunc(x)
secondFunc(x)
secondList = [ x for x in firstList if not process(x).discard ]
Если результат процесса (x) отличается от x, хотя, как показывает ваш пример, вы можете также изменить эту последнюю строку на следующую:
interimList = [ process(x) for x in firstList ]
secondList = [ x for x in interimList if not x.discard ]
Обратите внимание, что если вы хотите добавить эти результаты в secondList, используйте secondList.extend ([...]).
Редактировать: я понял, что я ошибочно написал "do not " change, но я имел в виду, если они действительно изменяют результат process ().
Редактировать 2: Описание / код очистки.