言語バージョン 3.9.0

公開日 2020年12月14日 JST

更新日 2020年12月19日 JST

コード例の出力としてprint関数を使用しています。

使用方法がわからない場合は以下のページを参照してからコード例を確認してください。

print関数の使用方法

filter

このページでは豊富な例を用いてPythonの組み込み関数であるfilter関数の使い方を学ぶことができます。

filterは組み込み関数の1つで、filterオブジェクト(フィルタ)を戻り値(返り値)として返します。 第1引数には関数かNoneを、第2引数には反復可能(iterable)なオブジェクトを取ります。

filterオブジェクトは イテレータ(iterator) であり、第1引数に与えた関数の条件に沿った値を生成します。

TL;DR

基本

def is_a(element):
    return element == 'a'

# 第1引数には関数、第2引数には反復可能なオブジェクトを指定する
list1 = ['a', 'b', 'c']
# 関数指定時に()丸括弧(parentheses)をつけないように注意
filter1 = filter(is_a, list1)
print(filter1)
==> <filter object at {オブジェクト識別値}>
print(type(filter1))
==> <class 'filter'>
# filter1から値を取得
for element in filter1:
    print(element)
# is_a関数がTrueを返す要素のみfilter1から生成される
==> a
# リスト化して値を得る
filter1 = filter(is_a, list1)
print(list(filter1))
==> ['a']




def is_greater_than_30(ele):
    return ele > 30

tuple1 = (9, 30, 50, 1, 100)
filter2 = filter(is_greater_than_30, tuple1)
# 30よりも大きい数のみフィルタリングされている
print(list(filter2))
==> [50, 100]




# lambda式(ラムダ)を用いる場合
list2 = [{'name': 'Noah', 'age': 16}, {'name': 'Zheng', 'age': 22}]
filter3 = filter(lambda e: e['age'] >= 18, list2)
# *(アスタリスク)演算子を使用して要素を展開
print(*filter3)
==> {'name': 'Zheng', 'age': 22}




# mapとの組み合わせ
list3 = [i for i in range(5)]
print(list3)
==> [0, 1, 2, 3, 4]
map1 = map(lambda e: e + 100, filter(lambda e: e % 2 != 0, list3))
print(*map1)
==> 101 103




# filterオブジェクトはイテレータなのでnext関数で値を取得可能
list4 = ['py', 'ts', 'js', 'py', 'kt']
filter4 = filter(lambda e: 'p' in e, list4)
while e := next(filter4, '-END-'):
    print(e)
    if e == '-END-':
        break
==> py
==> py
==> -END-

関連情報:type(組み込み関数)の使用方法

関連情報:forの使用方法

関連情報:whileの使用方法

関連情報:ifの使用方法

関連情報:list(リスト・配列)の使用方法

関連情報:map(組み込み関数)の使用方法

関連情報:def(関数定義)の使用方法

関連情報:lambda(ラムダ式)の使用方法

関連1次情報::= セイウチ演算子

第1引数がNoneの場合

# 第1引数にNoneを与える
tuple1 = (True, False, True, False, True)
filter1 = filter(None, tuple1)
# Trueと評価される要素のみにフィルタリングされる
print(list(filter1))
==> [True, True, True]




# フィルタリングされる要素が文字列の場合
list1 = ['', 'Python', '', '', 'JavaScript', 'Kotlin', '']
print(list(filter(None, list1)))
==> ['Python', 'JavaScript', 'Kotlin']




# フィルタリングされる要素が数値の場合
list2 = [0, 0 + 0j, 1, 1 + 1j, 2, 3, 0, 4]
print(list(filter(None, list2)))
==> [1, (1+1j), 2, 3, 4]

解説

基本

filter関数は引数で指定した値を元に、filter(フィルタ)オブジェクトを生成して戻り値として返します。

第1引数に関数またはNoneを、第2引数にはフィルタリングしたい反復可能なオブジェクトを与えます。 (Noneを与えた際の挙動は次項を参照してください。)
filter関数の第1引数に関数を指定すると、第2引数に指定した反復可能オブジェクトの各要素に対してこの関数が実行され、 暗黙的に第1引数に渡された後に指定関数がTrueを返す要素のみを生成するfilterオブジェクトを得ることができます。
第1引数には関数としてlambda式も指定することができます。

注意
filterオブジェクトはイテレータ(iterator)であるため、そのままでは値を参照(生成)することができません。
リスト化(list)、next関数、for文などを利用して値を生成してから要素にアクセスしてください。

def is_even(num):
    return num % 2 == 0

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filter1 = filter(is_even, list1)
print(filter1)
==> <filter object at {オブジェクト識別値}>
print(type(filter1))
==> <class 'filter'>
print(list(filter1))
==> [2, 4, 6, 8, 10]




# lambda(ラムダ)を使用する
tuple2 = ('Python', 'JavaScript', 'Java', 'Kotlin')
filter2 = filter(lambda e: 'o' in e, tuple2)
# *(アスタリスク)演算子を使用して要素を展開
print(*filter2)
==> Python Kotlin




# filterオブジェクトはイテレータなのでnext関数で値を取得可能
list2 = [{'id': 1, 'name': 'Riya'}, {'id': 2, 'name': 'Aarav'}]
filter3 = filter(lambda e: e['id'] == 1, list2)
while True:
    try:
        print(next(filter3))
    except StopIteration:
        break
==> {'id': 1, 'name': 'Riya'}

関連情報:type(組み込み関数)の使用方法

関連情報:whileの使用方法

関連情報:list(リスト・配列)の使用方法

関連情報:def(関数定義)の使用方法

関連情報:lambda(ラムダ式)の使用方法

第1引数がNoneの場合

filter関数の第1引数にNoneを指定した場合、 第2引数に指定した反復可能オブジェクトの各要素自体がTrueとなる要素を生成するfilterオブジェクトを返します。

list1 = [True, False, False]
filter1 = filter(None, list1)
print(list(filter1))
==> [True]




# フィルタリングされる要素が文字列の場合
list2 = ['', 'py', '', 'ts', 'js']
print(list(filter(None, list2)))
==> ['py', 'ts', 'js']

1次情報

filter(組み込み関数) - Pythonドキュメント

イテレータ型 - Pythonドキュメント

:= 代入式 - Pythonドキュメント