6

シーケンスのシーケンスがあるとしましょう。

{1, 2, 3}, {1, 2, 3}, {1, 2, 3}

このシーケンスをピボットまたはジップするための最良の方法は何ですか?代わりに、

{1, 1, 1}, {2, 2, 2}, {3, 3, 3}

IEnumerator<_>基になるタイプの操作に頼ることなく、そうするためのわかりやすい方法はありますか?

明確にするために、これらはseq<seq<int>>オブジェクトです。各シーケンス(内部と外部の両方)には、任意の数のアイテムを含めることができます。

4

4 に答える 4

4

意味的にSeqであるソリューションを探している場合は、常に怠惰なままでいる必要があります。

let zip seq = seq
            |> Seq.collect(fun s -> s |> Seq.mapi(fun i e -> (i, e))) //wrap with index
            |> Seq.groupBy(fst) //group by index
            |> Seq.map(fun (i, s) -> s |> Seq.map snd) //unwrap

テスト:

let seq =  Enumerable.Repeat((seq [1; 2; 3]), 3) //don't want to while(true) yield. bleh.
printfn "%A" (zip seq)

出力:

seq [seq [1; 1; 1]; seq [2; 2; 2]; seq [3; 3; 3]]
于 2012-10-07T10:33:35.623 に答える
1

これは非常にエレガントではないようですが、正しい答えが得られます。

(seq [(1, 2, 3); (1, 2, 3); (1, 2, 3);]) 
|> Seq.fold (fun (sa,sb,sc) (a,b,c) ->a::sa,b::sb,c::sc) ([],[],[]) 
|> fun (a,b,c) -> a::b::c::[]
于 2012-10-07T06:40:34.247 に答える
1

マトリックス転置のように見えます。

let data =
    seq [
        seq [1; 2; 3]
        seq [1; 2; 3]
        seq [1; 2; 3]
    ]

let rec transpose = function
    | (_::_)::_ as M -> List.map List.head M :: transpose (List.map List.tail M)
    | _ -> []

// I don't claim it is very elegant, but no doubt it is readable
let result =
    data
    |> List.ofSeq
    |> List.map List.ofSeq
    |> transpose
    |> Seq.ofList
    |> Seq.map Seq.ofList

または、エレガントなアクティブパターンに対するこの回答seqのおかげで、同じ方法を採用することもできます。

let (|SeqEmpty|SeqCons|) (xs: 'a seq) =
  if Seq.isEmpty xs then SeqEmpty
  else SeqCons(Seq.head xs, Seq.skip 1 xs)

let rec transposeSeq = function
    | SeqCons(SeqCons(_,_),_) as M ->
        Seq.append
            (Seq.singleton (Seq.map Seq.head M))
            (transposeSeq (Seq.map (Seq.skip 1) M))
    | _ -> Seq.empty

let resultSeq = data |> transposeSeq

技術的な詳細と2つのリファレンスについては、この回答も参照してください。PowerPackと、可変データMicrosoft.FSharp.Math.Matrixを含むさらに別の方法です。

于 2012-10-07T07:21:24.107 に答える
1

これは@Astiと同じ答えですが、少しクリーンアップしただけです。

[[1;2;3]; [1;2;3]; [1;2;3]] 
    |> Seq.collect Seq.indexed 
    |> Seq.groupBy fst 
    |> Seq.map (snd >> Seq.map snd);;
于 2016-08-31T15:45:00.060 に答える