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
のようにする。