前書き
組み込み関数, 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: 公式ドキュメント