Recherche…


Syntaxe

  • filtre (fonction, itérable)
  • itertools.ifilter (fonction, itérable)
  • future_builtins.filter (fonction, itérable)
  • itertools.ifilterfalse (fonction, itérable)
  • itertools.filterfalse (fonction, itérable)

Paramètres

Paramètre Détails
fonction callable qui détermine la condition ou None puis utilise la fonction d'identité pour le filtrage ( uniquement pour la position )
itérable iterable qui sera filtré ( uniquement positionnel )

Remarques

Dans la plupart des cas, une expression de compréhension ou de générateur est plus lisible, plus puissante et plus efficace que filter() ou ifilter() .

Utilisation de base du filtre

Pour filter éléments de suppression d'une séquence en fonction de certains critères:

names = ['Fred', 'Wilma', 'Barney']

def long_name(name):
    return len(name) > 5
Python 2.x 2.0
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>
Python 2.x 2.6
# 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>
Python 3.x 3.0
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>

Filtre sans fonction

Si le paramètre de la fonction est None , la fonction d'identité sera utilisée:

list(filter(None, [1, 0, 2, [], '', 'a']))  # discards 0, [] and ''   
# Out: [1, 2, 'a']
Python 2.x 2.0.1
[i for i in [1, 0, 2, [], '', 'a'] if i] # equivalent list comprehension
Python 3.x 3.0.0
(i for i in [1, 0, 2, [], '', 'a'] if i) # equivalent generator expression

Filtrer comme vérification de court-circuit

filter (python 3.x) et ifilter (python 2.x) renvoient un générateur afin qu'ils puissent être très utiles lors de la création d'un test de court-circuit comme or ou and :

Python 2.x 2.0.1
 # not recommended in real use but keeps the example short:
from itertools import ifilter as filter
Python 2.x 2.6.1
 from future_builtins import filter

Pour trouver le premier élément inférieur à 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 fonction next donne l'élément suivant (dans ce cas en premier lieu) et est donc la raison pour laquelle il est court-circuité.

Fonction complémentaire: filterfalse, ifilterfalse

Il y a une fonction complémentaire pour le filter dans le itertools :

Python 2.x 2.0.1
 # not recommended in real use but keeps the example valid for python 2.x and python 3.x
from itertools import ifilterfalse as filterfalse
Python 3.x 3.0.0
from itertools import filterfalse

qui fonctionne exactement comme le filter du générateur mais ne garde que les éléments qui sont 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)


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow