Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのイテレータ関数を徹底解説!accumulate・chain・filterfalse・dropwhileの使い方

はじめに

本記事では、Python 3.x(およびそれ以前のバージョン)で利用できる4つの便利なイテレータ関数について詳しく解説します。扱うのは accumulate()chain()filterfalse()dropwhile() の4つのメソッドです。これらはすべて標準ライブラリ itertools モジュールに含まれており、イテラブル(反復可能オブジェクト)を効率的に処理するための強力なツールです。

それでは、それぞれの関数を順番に見ていきましょう。

accumulate() と chain() メソッド

accumulate() の基本

accumulate() メソッドは2つの引数を受け取ります。1つ目は処理対象となるイテラブル、2つ目は適用する関数や演算です。2つ目の引数を省略した場合、デフォルトでは加算(足し算)が行われます。各ステップでの累積結果を順番に返してくれるのが特徴です。

chain() の基本

chain() メソッドは、複数のイテラブルを連結し、そのすべての要素を一つのシーケンスとして順に出力します。複数のリストやタプルをまとめて処理したい場合に非常に便利です。

コード例

import itertools
import operator as op

# リスト1の初期化
li1 = ['t','u','t','o','r']
# リスト2の初期化
li2 = [1,1,1,1,1]
# リスト3の初期化
li3 = ['i','a','l','s','p','o','i','n','t']

# accumulate() を加算で使用
print("各イテレーション後の合計値 : ",end="")
print(list(itertools.accumulate(li1,op.add)))

# accumulate() を乗算で使用
print("各イテレーション後の積 : ",end="")
print(list(itertools.accumulate(li2,op.mul)))

# chain() メソッドを使用
print("連結されたすべての値 : ",end="")
print(list(itertools.chain(li1,li3)))

実行結果

各イテレーション後の合計値 : ['t', 'tu', 'tut', 'tuto', 'tutor']
各イテレーション後の積 : [1, 1, 1, 1, 1]
連結されたすべての値 : ['t', 'u', 't', 'o', 'r', 'i',
'a', 'l', 's', 'p', 'o', 'i', 'n', 't']

この例では、文字列リストに対して op.add を使うことで、要素が順に連結されていく様子が確認できます。また、数値リストに対する op.mul では累積の掛け算結果が返されています。chain() については、2つのリストの全要素が一列に並んで出力されていることがわかります。

dropwhile() と filterfalse() メソッド

dropwhile() の基本

dropwhile() メソッドは、条件を判定する関数と処理対象のイテラブルを受け取ります。条件が真である間は要素をスキップ(捨て)し、条件が初めて偽になった以降のすべての要素を返します。

filterfalse() の基本

filterfalse() メソッドも同様に、条件判定用の関数とイテラブルを受け取ります。こちらは条件が偽になる要素だけを抽出して返します。組み込み関数 filter() の逆の動作をするものと考えると分かりやすいでしょう。

コード例

import itertools

# リスト
l = ['t','u','t','o','r']

# dropwhile() メソッドを使用
print("条件が偽になった後の値 : ",end="")
print(list(itertools.dropwhile(lambda x : x!='o',l)))

# filterfalse() メソッドを使用
print("条件が偽となる値 : ",end="")
print(list(itertools.filterfalse(lambda x : x!='o',l)))

実行結果

条件が偽になった後の値 : ['o', 'r']
条件が偽となる値 : ['o']

この例では、ラムダ式 x != 'o' を条件としています。dropwhile() では「'o' 以外」である限り要素をスキップし、'o' に出会った時点から残りの ['o', 'r'] を返します。一方 filterfalse() は、条件が偽(つまり要素が 'o')となる要素のみを抽出するため、結果は ['o'] となります。

まとめ

本記事では、Python 3.x で利用できる代表的なイテレータ関数として、accumulate()chain()filterfalse()dropwhile() の4つを紹介しました。これらの関数を使いこなすことで、ループ処理をより簡潔かつ効率的に記述できるようになります。日常的なデータ処理や大規模なデータ操作においても活躍する場面が多いので、ぜひ実際のコードで試してみてください。

  1. Pythonでパターンを出力する方法|三角形・数字・アルファベット・ピラミッドのコード例

    Pythonでパターンを出力するには、ネストされた(入れ子構造の)forループを使用します。外側のループで行数を制御し、内側のループで列数を処理します。そしてprint文を工夫することで、目的に応じたさまざまなパターンを作成できます。パターンには、星(アスタリスク)パターン、数字パターン、アルファベットパターンなどがあり、三角形やピラミッドなど、さまざまな形状にも対応できます。パターン出力の基本これらのパターンは、print文を少し変更しながらforループを組み合わせることで出力できます。基本的な考え方はどのパターンも共通しており、違いはごくわずかです。ここからは、代表的なパターンのコードを実

  2. PythonでPOSTメソッドを使ってCGIプログラムに情報を渡す方法

    CGIプログラムへ情報を渡す方法としては、POSTメソッドの方が一般的により信頼性が高いとされています。POSTメソッドは、GETメソッドとまったく同じ形式でデータをパッケージ化しますが、URLの「?」以降にテキスト文字列として付加して送信するのではなく、独立したメッセージとして送り出す点が異なります。このメッセージは、標準入力(stdin)を通じてCGIスクリプトへ渡されます。POSTメソッドの主な特徴送信データがURLに表示されないため、GETメソッドよりも安全性が高いURLの長さ制限を受けないため、大量のデータも送信できるデータはリクエストボディに格納され、標準入力経由でCGIスクリプト