【Python基礎】自作関数を使ってリストや辞書から条件を満たす要素を抽出するfilter関数

  • URLをコピーしました!
目次

filter関数

前回、Pandasでisinと==を使って特定の値の要素を抽出する方法を紹介しました。

今回は自作関数を使ってリストや辞書から条件を満たす要素を抽出するfilter関数を紹介します。

例えば0から9までの数値のリストから5以上のものを新たなリストとして抽出する場合、for文を使うとこんな感じになります。

a_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

selected = []
for a_val in a_list:
    if a_val >= 5:
        selected.append(a_val)

print(selected)

実行結果
[5, 6, 7, 8, 9]

今回はこれをfilter関数で置き換えてみましょうというお話です。

それでは始めていきましょう。

リストから要素を抽出

filter関数を使ってリストから要素を抽出するには、まず抽出する条件を設定した自作関数が必要です。

例えば5以上のものを抽出したい場合はこんな感じになります。

def val_check(val):
    return val >= 5

そして「filter(関数名, リスト)」とすると条件にあった要素を集めたリストのオブジェクトが返されます。

a_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

def val_check(val):
    return val >= 5

selected = filter(val_check, a_list)

print(list(selected))

実行結果
[5, 6, 7, 8, 9]

ここで注意する点はオブジェクトが返ってくるので、リストにしたい場合は「list(オブジェクト)」としてリストに変換することが必要です。

ちなみに変換しないとこんな感じの出力になります。

a_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

def val_check(val):
    return val >= 5

selected = filter(val_check, a_list)

print(selected)

実行結果
<filter object at 0x1185767a0>

この仕組みですが、自己関数の部分はこの形式で入力された値に対してTrueかFalseかを出力します。

a_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

def val_check(val):
    return val >= 5

print(val_check(2))
print(val_check(7))

実行結果
False
True

このTrueになった要素を集める役割がfilter関数の様です。

辞書から要素を抽出

辞書から同じ様にして要素を抽出しようとするとエラーとなります。

a_dict = {"A":0, "B":1, "C":2, "D":3, "E":4, "F":5, "G":6, "H":7, "I":8, "J":9}

def val_check(val):
    return val >= 5

selected = filter(val_check, a_dict)

print(list(selected))

実行結果
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[16], line 8
      4     return val >= 5
      6 selected = filter(val_check, a_dict)
----> 8 print(list(selected))

Cell In[16], line 4, in val_check(val)
      3 def val_check(val):
----> 4     return val >= 5

TypeError: '>=' not supported between instances of 'str' and 'int'

注意すべきは辞書の場合はfor文で辞書の要素にアクセスしようとすると、取得できるのはキーです。

a_dict = {"A":0, "B":1, "C":2, "D":3, "E":4, "F":5, "G":6, "H":7, "I":8, "J":9}

for val in a_dict:
    print(val)

実行結果
A
B
C
D
E
F
G
H
I
J

しかし通常比較すべきはその値の方なので、自己関数を値を取得する様に修正します。

a_dict = {"A":0, "B":1, "C":2, "D":3, "E":4, "F":5, "G":6, "H":7, "I":8, "J":9}

def val_check(val):
    return a_dict[val] >= 5

selected = filter(val_check, a_dictd)

print(list(selected))

実行結果
['F', 'G', 'H', 'I', 'J']

Pandasのデータフレームから抽出

Pandasのデータフレームからもfilter関数を使ってデータを抽出することができます。

その場合は「filter(関数名, 抽出したいデータの列や行)」とします。

import pandas as pd

a_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

def val_check(val):
    return val >= 5

df = pd.DataFrame(a_list, columns=["A"])

selected = filter(val_check, df["A"])

print(list(selected))

実行結果
[5, 6, 7, 8, 9]

次回はfunctoolsのreduce関数を使ってリスト内の全要素の計算値を取得する方法を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次