수색…


통사론

  • 필터 (함수, 반복 가능)
  • itertools.ifilter (함수, 반복 가능)
  • future_builtins.filter (함수, 반복 가능)
  • itertools.ifilterfalse (함수, 반복 가능)
  • itertools.filterfalse (함수, 반복 가능)

매개 변수

매개 변수 세부
기능 조건을 결정하거나 호출 None 다음 (위치 만) 필터링이 항등 함수를 사용하지
반복 가능한 필터링 될 iterable ( 위치 한정 )

비고

대부분의 경우 이해력 또는 생성자 표현식filter() 또는 ifilter() 보다 읽기 쉽고 강력하며 효율적입니다.

필터의 기본 사용법

하기 filter 폐기 일부 기준에 따라 시퀀스의 요소 :

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>

함수없이 필터링

함수 매개 변수가 None 이면 ID 함수가 사용됩니다.

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

단락 점검 용 필터

filter (python 3.x)와 ifilter (python 2.x)는 생성기를 반환하므로 or or 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

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 함수는 다음 요소 (이 경우 첫 번째 요소)를 제공하므로 단락 회로가되는 이유입니다.

보완 함수 : filterfalse, ifilterfalse

itertools 에는 filter 에 대한 보완 함수가 있습니다.

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

이것은 생성기 filter 와 정확히 똑같이 작동하지만 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
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow