Python Language
Filter
Suche…
Syntax
- Filter (Funktion, iterierbar)
- itertools.ifilter (Funktion, iterierbar)
- future_builtins.filter (Funktion, iterierbar)
- itertools.ifilterfalse (Funktion, iterierbar)
- itertools.filterfalse (Funktion, iterierbar)
Parameter
Parameter | Einzelheiten |
---|---|
Funktion | aufrufbare, die den Zustand oder bestimmt None zum Filtern (Positions-only) , dann verwenden , um die Identitätsfunktion |
iterable | iterierbar, dass gefiltert wird (nur positionell ) |
Bemerkungen
In den meisten Fällen ist ein Verständnis- oder Generatorausdruck lesbarer, leistungsfähiger und effizienter als filter()
oder ifilter()
.
Grundlegende Verwendung des Filters
Verworfene Elemente einer Sequenz anhand einiger Kriterien filter
:
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>
Filter ohne Funktion
Wenn der Funktionsparameter None
, wird die Identitätsfunktion verwendet:
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
Als Kurzschlussprüfung filtern
filter
(Python 3.x) und ifilter
(Python 2.x) zurückkehren , einen Generator , so dass sie sehr praktisch sein kann , wenn ein Kurzschlusstest wie das Erstellen or
oder and
:
# not recommended in real use but keeps the example short:
from itertools import ifilter as filter
from future_builtins import filter
So finden Sie das erste Element, das kleiner als 100 ist:
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)
Die next
gibt das nächste (in diesem Fall das erste) Element an und ist daher der Grund, warum es einen Kurzschluss gibt.
Komplementärfunktion: filterfalse, ifilterfalse
Es gibt eine ergänzende Funktion zum filter
im itertools
Modul:
# 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
die funktionieren genau wie die Generator - filter
, sondern halten nur die Elemente , die sind 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)