p_tan's blog

勉強日記です。ツッコミ大歓迎

シーケンスの要素をグループに分ける Seq.groupBy #fsharp

  • Seq.groupByはseq中の要素に対応する整数値でseqの要素をグループに分ける。
seq {1..100} |> Seq.groupBy (fun x -> x % 2) // seq [(1, seq [1; 3; 5; 7; ...]); (0, seq [2; 4; 6; 8; ...])]
  • 使用例
// シーケンスをn個毎のサブシーケンスに分ける
let split n (sq : seq<_>) = 
    Seq.mapi (fun idx elem -> idx, elem) sq
    |> Seq.groupBy (fun (idx, _) -> idx / n)
    |> Seq.map (snd >> Seq.map snd)

// シーケンスをn個おきのサブシーケンスに分ける
let everyNth n (sq : seq<_>) =
    Seq.mapi (fun idx elem -> idx, elem) sq
    |> Seq.groupBy (fun (idx, _) -> idx % n)
    |> Seq.map (snd >> Seq.map snd)

seq {1..100} |> split 3 // = seq [seq [1; 2; 3]; seq [4; 5; 6]; seq [7; 8; 9]; seq [10; 11; 12]; ...]
seq {1..100} |> everyNth 3 // = seq [seq [1; 4; 7; 10; ...]; seq [2; 5; 8; 11; ...]; seq [3; 6; 9; 12; ...]]