Irohabook
0
1699

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 <module>
    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

のようにする。

次の記事

リスト・辞書