Por acaso, encontrei uma necessidade básica de filtragem: tenho uma lista e tenho que filtrá-la por um atributo dos itens.
Meu código ficou assim:
my_list = [x for x in my_list if x.attribute == value]
Mas então pensei: não seria melhor escrever assim?
my_list = filter(lambda x: x.attribute == value, my_list)
É mais legível e, se necessário para o desempenho, o lambda pode ser retirado para obter algo.
A pergunta é: existem algumas ressalvas no uso da segunda maneira? Alguma diferença de desempenho? Estou sentindo falta do Pythonic Way ™ inteiramente e devo fazê-lo de outra maneira (como usar o itemgetter em vez do lambda)?
filter
é um objeto gerador de filtro e não uma lista.
filter
era mais legível. Quando você tem uma expressão simples que pode ser usada como está em um listcomp, mas precisa ser empacotada em um lambda (ou similarmente construído compartial
ouoperator
funções, etc.) para passarfilter
, é quando os listcomps vencem.