Eu tenho uma lista de valores que eu preciso filtrar dados os valores em uma lista de booleanos:
list_a = [1, 2, 4, 6]
filter = [True, False, True, False]
Eu gero uma nova lista filtrada com a seguinte linha:
filtered_list = [i for indx,i in enumerate(list_a) if filter[indx] == True]
o que resulta em:
print filtered_list
[1,4]
A linha funciona, mas parece (para mim) um pouco exagerada e eu queria saber se havia uma maneira mais simples de conseguir o mesmo.
Conselhos
Resumo de dois bons conselhos dados nas respostas abaixo:
1- Não nomeie uma lista filter
como eu fiz, porque é uma função interna.
2- Não compare as coisas True
como eu fiz, if filter[idx]==True..
pois é desnecessário. Basta usar if filter[idx]
é suficiente.
if filter[indx] == True
Você não usar ==
se você quiser verificar se há identidade com True
, uso is
. De qualquer forma, neste caso, toda a comparação é inútil, você pode simplesmente usar if filter[indx]
. Por fim: nunca use o nome de um built-in como um nome de variável / módulo (estou me referindo ao nome filter
). Usando algo como included
, para que if
leia bem ( if included[indx]
).