前書き
組み込み関数, itertools, more_itertools を網羅的・コンパクトに概観する。
前提:
イテレータを使うことで 必要に迫られるまで処理を後回しにできる。組み込み関数だけでも恩恵があるが itertoolsと サードパーティ製モジュールmore_itertoolsを使うと より表現力が増す。
表記:
-
itertoolsは接頭辞なしで言及する。例:itertools.countはcount -
more_itertoolsは接頭辞Mで言及する。例:M.chunked - イテはイテレータの略
意義:
個々の関数を引っ張ってこれるようになるのも重要だが、ストリーム系の処理を カテゴライズする/典型を理解する ことは長く使える知識になる。名付けと分類はその近道。
本文
イテ作成: range,iter,count,repeat,M.repeatfunc,M.iterate,M.tabulateで無からイテを作れる。cycle,M.ncycle,M.count_cycleは繰り返してカサ増し。teeはコピー。
イテ微調整: enumerateはインデックス付与, M.intersperseはセパレータ挿入。M.padded,M.padnoneは短い時の埋め草。M.prependは先頭に追加。M.collapse,M.flattenは平坦化。M.consumeはイテを進めるだけ。
イテ結合: chain,from_iterableは直列的結合。zip,zip_longest,M.zip_offsetは並列的結合。M.interleave,M.interleave_longest,M.roundrobinは別の並列的結合。
イテ分割: M.partitionは述語で2つのイテに分割。M.bucketはキー関数で分割。M.divide,M.distributeはNつに分割。M.unzipはzipの逆。
要素→listOf要素(grouping): M.chunked,M.slicedは要素をN個組に。M.grouperはイテの要素数をNに。M.split_atは述語で集める(セパレータは消失)。M.split_before,M.split_afterではセパレータは消失しない。M.split_intoは不均一に集める。
要素→listOf要素(windowing): M.windowedはWindow作成, M.pairwiseは幅2のWindow。M.staggerで変則的なWindow。
述語判定: M.adjacentは述語の判定結果を付与。M.locate,M.rlocateは述語を満たすインデックスを要素にもつイテを作成。
述語でフィルタ: filter, filterfalseが基本。takewhile,dropwhileは字義通り。M.strip,M.lstrip,M.rstripはイテの最初と最後の方にフォーカスしたフィルタ。M.first_trueはピンポイントで1個欲しい時。
非述語でフィルタ: isliceが基本。M.islice_extendedは負のインデックスを指定可。M.take,M.tailは最初/最後のN個が欲しい時。next,M.first,M.last,M.nthはピンポイントで1個欲しい時。M.unique_everseen,M.unique_justseenは(努力的に)重複排除。M.compressはマスクでフィルタ。
イテ自身に関する述語/関数: allは全数確認, anyは存在確認, M.all_equalは全部同じかを確認。M.ilenは長さ。M.oneは要素数1のアサーション兼要素取得。M.exactly_nは述語を満たす要素数をテスト。M.quantifyは述語を満たす要素数の数。
関数適用: map(注:zipWithとしても使える), starmapが簡便な時も。
集約系操作: accumulateは累積和(和以外の任意の関数も使える)。M.differenceは階差。groupByはグループ化。M.groupby_transformはグループ化+map。M.map_reduceはグループ化してその各グループ中でmap + reduceを実行。
特殊操作: M.side_effectはタップ+α。M.replaceは置換。M.sort_togetherは超便利なソート。M.collateはソート済みなN個のイテをマージ。M.dotproductは内積。 M.unique_to_eachは重複確認。M.run_length, 情報理論の圧縮技術で使うやつ。 M.numeric_range, numpyでのlinspace。
先読み系: M.spyでN個先読み。M.peekableは先読み結果に応じて微修正(prepend)したい時。M.seekableでメモしながらインデックスで行き来(メモリ注意)。
イテ生成(組み合わせ論): 必要な時にドキュメントを読むべしcombinations,combinations_with_replacement,permutations,product,M.distinct_permutations, M.circular_shifts, M.partitions, M.powerset, M.random_product, M.random_permutation, M.random_combination, M.random_combination_with_replacement, M.nth_combination
細々としたこと
- 要素→listOf要素 は一般的に grouping ないし windowing と呼ばれる操作。
-
isliceは N個おきにとってくる takeEvery としても使える(オフセット指定も可)その観点で見るとM.distribute(の実装)はその兄弟。
参考
- 公式ドキュメント
- more-itertools: 公式ドキュメント