itertools
前回、リスト内の要素に一つ以上真(True)が含まれるかどうか確認するany関数を紹介しました。
今回はitertoolsのdropwhile、takewhile、filterfalse、starmapの使い方を紹介します。
ちなみにイテレータなのでアンパックしないとprint関数で表示できないため、「*(アスタリスク)」を使ったアンパックをしていますのでご注意ください。
それでは始めていきましょう。
dropwhile、takewhile
dropwhileはリストの中で指定した条件がFalseになった要素以降の要素を取得する関数で、takewhileは逆にFalseになる前までの要素を取得する関数です。
使い方はitertoolsの「dropwhile」、もしくは「takewhile」をインポートして、「dropwhile(判定のための関数, リスト)」、「takewhile(判定のための関数, リスト)」として用います。
from itertools import dropwhile
val_list = [3, 4, 6, 1, 8, 2, 5, 0, 7, 9]
def val_check(val):
return val < 8
print(*dropwhile(val_check, val_list))
実行結果
8 2 5 0 7 9
from itertools import takewhile
val_list = [3, 4, 6, 1, 8, 2, 5, 0, 7, 9]
def val_check(val):
return val < 8
print(*takewhile(val_check, val_list))
実行結果
3 4 6 1
判定のための関数には無名関数(ラムダ式)を使うこともできます。
無名関数に関しては前に記事を書いておりますので、よかったらどうぞ。
from itertools import dropwhile
val_list = [3, 4, 6, 1, 8, 2, 5, 0, 7, 9]
print(*dropwhile(lambda x: x < 8, val_list))
実行結果
8 2 5 0 7 9
from itertools import takewhile
val_list = [3, 4, 6, 1, 8, 2, 5, 0, 7, 9]
print(*takewhile(lambda x: x < 8, val_list))
実行結果
3 4 6 1
filterfalse
filterfalseは条件がFalseになった要素を取得する関数です。
使い方はitertoolsの「filterfalse」をインポートして、「filterfalse(判定のための関数, リスト)」として用います。
from itertools import filterfalse
val_list = [3, 4, 6, 1, 8, 2, 5, 0, 7, 9]
def val_check(val):
return val < 8
print(*filterfalse(lambda x: x < 8, val_list))
実行結果
8 9
filterfalseも無名関数を使うことができます。
from itertools import filterfalse
val_list = [3, 4, 6, 1, 8, 2, 5, 0, 7, 9]
print(*filterfalse(lambda x: x < 8, val_list))
実行結果
8 9
starmap
starmapは関数に引数のセットを順番に渡していける関数です。
分かりにくいですが、通常関数に渡すことのできる引数は1セットです。
例えばこのように一つの関数に2つの引数「a, b」があったとして、これに一度に渡せる引数のセットは一つだけです。
def calc(a, b):
return a**b
print(calc(2, 5))
実行結果
32
そして例えばリストを使って複数渡そうとしてもエラーとなります。
def calc(a, b):
return a**b
print(calc([[2, 5], [10, 2]]))
実行結果
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[4], line 4
1 def calc(a, b):
2 return a**b
----> 4 print(calc([[2, 5], [10, 2]]))
TypeError: calc() missing 1 required positional argument: 'b'
しかし「starmap」を使うと引数のセットを一度に複数渡すことができます。
使い方はitertoolsの「starmap」をインポートして、「starmap(関数, 引数セットのリスト)」とします。
from itertools import starmap
def calc(a, b):
return a**b
print(*starmap(calc, [[2, 5], [10, 2]]))
実行結果
32 100
上の例では関数の引数は2つですが、さらに増やすことも可能です。
from itertools import starmap
def calc(a, b, c):
return a*b+c
print(*starmap(calc, [[2, 5, 3], [10, 2, 5]]))
実行結果
13 25
次回はNumPyを使って任意の平均・標準誤差をもつガウス分布(正規分布)を作る方法を紹介します。
ではでは今回はこんな感じで。
コメント