【itertools】dropwhile、takewhile、filterfalse、starmapの使い方[Python]

  • URLをコピーしました!
目次

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を使って任意の平均・標準誤差をもつガウス分布(正規分布)を作る方法を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次