Python Language
Filtrar
Buscar..
Sintaxis
- filtro (función, iterable)
- itertools.ifilter (función, iterable)
- future_builtins.filter (función, iterable)
- itertools.ifilterfalse (función, iterable)
- itertools.filterfalse (función, iterable)
Parámetros
Parámetro | Detalles |
---|---|
función | llamable que determina la condición o None luego use la función de identidad para el filtrado ( solo de posición ) |
iterable | iterable que será filtrado ( solo posicional ) |
Observaciones
En la mayoría de los casos, una expresión de comprensión o generador es más legible, más potente y más eficiente que filter()
o ifilter()
.
Uso básico del filtro.
Para filter
descartan elementos de una secuencia en función de algunos criterios:
names = ['Fred', 'Wilma', 'Barney']
def long_name(name):
return len(name) > 5
filter(long_name, names)
# Out: ['Barney']
[name for name in names if len(name) > 5] # equivalent list comprehension
# Out: ['Barney']
from itertools import ifilter
ifilter(long_name, names) # as generator (similar to python 3.x filter builtin)
# Out: <itertools.ifilter at 0x4197e10>
list(ifilter(long_name, names)) # equivalent to filter with lists
# Out: ['Barney']
(name for name in names if len(name) > 5) # equivalent generator expression
# Out: <generator object <genexpr> at 0x0000000003FD5D38>
# Besides the options for older python 2.x versions there is a future_builtin function:
from future_builtins import filter
filter(long_name, names) # identical to itertools.ifilter
# Out: <itertools.ifilter at 0x3eb0ba8>
filter(long_name, names) # returns a generator
# Out: <filter at 0x1fc6e443470>
list(filter(long_name, names)) # cast to list
# Out: ['Barney']
(name for name in names if len(name) > 5) # equivalent generator expression
# Out: <generator object <genexpr> at 0x000001C6F49BF4C0>
Filtro sin función
Si el parámetro de la función es None
, se utilizará la función de identidad:
list(filter(None, [1, 0, 2, [], '', 'a'])) # discards 0, [] and ''
# Out: [1, 2, 'a']
[i for i in [1, 0, 2, [], '', 'a'] if i] # equivalent list comprehension
(i for i in [1, 0, 2, [], '', 'a'] if i) # equivalent generator expression
Filtrar como comprobación de cortocircuito.
filter
(3.x pitón) y ifilter
(Python 2.x) devuelve un generador, así que puede ser muy útil cuando se crea un ensayo de cortocircuito como or
o and
:
# not recommended in real use but keeps the example short:
from itertools import ifilter as filter
from future_builtins import filter
Para encontrar el primer elemento que es más pequeño que 100:
car_shop = [('Toyota', 1000), ('rectangular tire', 80), ('Porsche', 5000)]
def find_something_smaller_than(name_value_tuple):
print('Check {0}, {1}$'.format(*name_value_tuple)
return name_value_tuple[1] < 100
next(filter(find_something_smaller_than, car_shop))
# Print: Check Toyota, 1000$
# Check rectangular tire, 80$
# Out: ('rectangular tire', 80)
La next
función proporciona el siguiente elemento (en este caso, primero) y es, por lo tanto, la razón por la que es un cortocircuito.
Función complementaria: filterfalse, ifilterfalse
Hay una función complementaria para el filter
en el módulo itertools
:
# not recommended in real use but keeps the example valid for python 2.x and python 3.x
from itertools import ifilterfalse as filterfalse
from itertools import filterfalse
que funciona exactamente igual que el filter
del generador pero mantiene solo los elementos que son False
:
# Usage without function (None):
list(filterfalse(None, [1, 0, 2, [], '', 'a'])) # discards 1, 2, 'a'
# Out: [0, [], '']
# Usage with function
names = ['Fred', 'Wilma', 'Barney']
def long_name(name):
return len(name) > 5
list(filterfalse(long_name, names))
# Out: ['Fred', 'Wilma']
# Short-circuit useage with next:
car_shop = [('Toyota', 1000), ('rectangular tire', 80), ('Porsche', 5000)]
def find_something_smaller_than(name_value_tuple):
print('Check {0}, {1}$'.format(*name_value_tuple)
return name_value_tuple[1] < 100
next(filterfalse(find_something_smaller_than, car_shop))
# Print: Check Toyota, 1000$
# Out: ('Toyota', 1000)
# Using an equivalent generator:
car_shop = [('Toyota', 1000), ('rectangular tire', 80), ('Porsche', 5000)]
generator = (car for car in car_shop if not car[1] < 100)
next(generator)