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
のようにする。
リスト・辞書
-
Pythonのlen関数:辞書の要素数(長さ)を取得する02183
-
Pythonの辞書から要素を削除する(del)0177
-
Pythonの辞書から要素を削除する(pop)0203
-
Pythonの辞書からキーと値をforで取得する0140
-
listの基本的な使い方|Python0802
-
辞書の基本的な使い方|Python0254
-
Pythonの集合(要素の存在確認、追加、削除)010211
-
Pythonのリスト:インデックスを指定して値を取得する02732
-
Pythonのリストを連結する(足し算)04100
-
Pythonのリストで特定の値を削除する(remove)01607
-
Pythonでリストから要素を削除する(del)01102
-
Pythonで整数の範囲をリストに入れる(range)09006
-
Pythonのリストから重複する要素をカウントする(count)011469