Pythonのfilterを使う:リストから条件に合う要素を削除しよう

Python でリストから特定の要素を削除したいときは filter を使う。

def has_many_letters(str):
c = len(str)
if c > 3:
return True
else:
return False

a = [‘apple’, ‘mac’, ‘google’, ‘e’, ‘’]
b = list(filter(has_many_letters, a))

print(b)

[‘apple’, ‘google’]

ポイントは filter で、これはリストから条件に合う要素を削除する。条件、リストの順に入れる。

filter(条件, リスト)

条件はだいたい関数である。上の Python コードでは、最初に定義された has_many_letters が条件に当たる。これは文字列の長さ(文字数)が 3 より多かったら真、それ以外で偽を返す。

条件にする関数はあくまでも個別の値に対する関数である。

Python の filter に入れる引数はカッコをつけない

Python の filter に入れる関数は名前のみを記し、カッコをつけない。次のコードは誤り。

b = list(filter(has_many_letters(), a))

カッコを入れると

Traceback (most recent call last):
File “/PycharmProjects/example/test.py”, line 9, in
b = list(filter(is_mod3(), a))
TypeError: is_mod3() missing 1 required positional argument: ‘num’

のようなメッセージが出る。ちなみに PycharmProjects は Python を書くためのソフト。

filter の前についている list をとったらどうなるか

出力されるものの変化を見てみよう。

def has_many_letters(str):
c = len(str)
if c > 3:
return True
else:
return False

a = [‘apple’, ‘mac’, ‘google’, ‘e’, ‘’]
b = filter(has_many_letters, a)

print(b)

<filter object at 0x10dd2c0f0>

filter object at 0x10dd2c0f0 という謎のものが出力された。これは文字どおり filter object というもので、使いにくい。だから最初のコードのように

list(filter(…))

と list をつける。

Python プログラミングの問題

リストから 3 の倍数を削除する Python プログラムを書きなさい。

答え

def is_mod3(num):
if num % 3 == 0:
return False
else:
return True

a = [2, 3, 5, 6, 7]
b = list(filter(is_mod3, a))

print(b)

[2, 5, 7]

Python の mod 計算(余りを求める計算)は

num % 3

のようにする。

Pythonのfilterの使い方。filterはPythonのリストから特定の条件に合う要素を削除する。filterには適用したい関数とリストを順に入れる。