Python Language
Filtrera
Sök…
Syntax
- filter (funktion, iterable)
- itertools.ifilter (funktion, iterable)
- future_builtins.filter (funktion, iterable)
- itertools.ifilterfalse (funktion, iterable)
- itertools.filterfalse (funktion, iterable)
parametrar
Parameter | detaljer |
---|---|
fungera | kallbar som bestämmer villkoret eller None använd sedan identitetsfunktionen för filtrering (endast position ) |
iterable | iterable som kommer att filtreras (endast positionellt ) |
Anmärkningar
I de flesta fall är ett förståelse- eller generatoruttryck mer läsbart, kraftfullare och effektivare än filter()
eller ifilter()
.
Grundläggande användning av filter
Så här filter
element i en sekvens baserat på vissa kriterier:
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>
Filtrera utan funktion
Om funktionsparametern är None
, kommer identitetsfunktionen att användas:
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
Filtrera som kortslutningskontroll
filter
(python 3.x) och ifilter
(python 2.x) returnerar en generator så att de kan vara mycket praktiska när du skapar ett kortslutningstest som or
eller and
:
# not recommended in real use but keeps the example short:
from itertools import ifilter as filter
from future_builtins import filter
För att hitta det första elementet som är mindre än 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)
next
funktion ger nästa (i det här fallet första) elementet i och är därför anledningen till att det är kortslutning.
Kompletterande funktion: filterfalse, ifilterfalse
Det finns en kompletterande funktion för filter
i itertools
modulen:
# 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
som fungerar precis som generatorn filter
men håller bara de element som är 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)