filter() – filtrando elementos de uma lista

Imagine uma situação na qual você tenha uma lista composta por uma grande quantidade de números, e deseja utilizar esses números para a realização de um cálculo. Porém, alguns desses valores devem ser descartados, por não se enquadrarem na faixa de valores que você pode utilizar nos cálculos. Como retirar os elementos que não cumprem os requisitos?

A solução mais óbvia seria percorrer a lista removendo os elementos que não cumpram o requisito, ou então, criar uma nova lista somente com os elementos que cumprem o requisito. Considere que o requisito seja: somente números positivos podem compor a lista. Vamos considerar a lista lista como exemplo:

lista = [8, 9, -1, -3, 3, -5, -4, 5, -4, 2, 5, 91, -11, 5, 10, 93, -75]
lista_valida = []
for elem in lista:
    if elem > 0:
        lista_valida.append(elem)
print lista_valida

O código acima cria uma nova lista (lista_valida) somente com os elementos positivos da lista lista. Funciona, certo? Sim, mas Python oferece uma forma mais prática e elegante para fazermos isso, a função filter(). Como o nome já diz, ela filtra uma lista. Ou seja, só “passam” os elementos que cumprirem os requisitos. A função filter() recebe dois parâmetros: uma função para validação de cada elemento, e uma sequência de valores (como uma lista, por exemplo). Vamos implementar o exemplo anterior utilizando filter().

lista = [8, 9, -1, -3, 3, -5, -4, 5, -4, 2, 5, 91, -11, 5, 56, 93, 13, 15, -75, 98]
def maior_que_zero(num):
    if num > 0:
        return True
 else:
        return False

lista_valida = filter(maior_que_zero, lista)
print lista_valida

Criamos uma função chamada maior_que_zero() que retorna True caso o valor recebido como parâmetro seja maior que 0 e False, caso contrário. Essa função vai ser chamada para cada elemento da lista lista, quando executarmos a função filter(), e essa, por sua vez, só vai incluir na lista nova (a ser retornada) os valores para os quais a execução de maior_que_zero() resultaram em True.

Vamos a outro exemplo: temos uma lista composta por strings e queremos obter uma lista contendo somente as strings que começam pela letra ‘a’ ou pela letra ‘e’.

palavras = ['teste', 'assistente', 'estou', 'aqui', 'onde', 'ouro', 'adeus']
def f(p):
    return p.startswith('a') or p.startswith('e')

print filter(f, palavras)

No código acima, aplicamos a função f() a cada elemento de palavras para filtrar essa lista. Ao final, filter() retorna uma lista contendo somente os elementos para os quais a expressão p.startswith(‘a’) or p.startswith(‘e’) retorna True (que são os elementos que iniciam por ‘a’ ou por ‘e’).

Esse é mais um dos tantos recursos interessantes que Python nos oferece e que podemos utilizar em nosso benefício. Teste os códigos acima e faça seus próprios testes.

Anúncios

Acessando o último elemento de uma lista

Essa vai ser uma dica rápida, mas muito útil…

Consideremos uma lista qualquer contendo alguns números inteiros:

>>> L = [1, 1, 2, 3, 5, 8, 13, 21]

Como podemos acessar o último elemento dessa lista? Nessa lista específica, poderíamos acessar o último elemento assim: L[7]. Mas é claro que isso funciona só para a lista L com 8 elementos. E para acessar o último elemento de uma lista qualquer?

>>> L[len(L)-1]
21

O código acima é uma das formas de acessar o último elemento de uma lista, mas não é a forma mais conveniente. Python nos oferece uma forma muito melhor para fazer isso:

>>> L[-1]
21

Também podemos acessar o penúltimo elemento através do índice -2, e assim por diante. Legal né? Pois é, mais uma das coisas que tornam Python tão legal. 🙂