F#:列表和元组如何获得所需的输出?

F#: List and tuple How can i obtain the desired output?

我想对数据进行分组,使其包含列表,其中第一个元素是某个不同的项目(如键),第二个元素应该是元组列表,其中第一个元素是键。 例如:如果 return 类型 (string * (string list * int)) list 的列表是

[("key1",(["data1";"data2"],1));("key1",(["data3";"data4"],10))]

那么 output 应该是 returning
(string * (string list * int) list) list

[("key1",[(["data1";"data2"],1);(["data3";"data4"],10)])]
let datat= [("a",(["a";"k"],5));("b",(["b";"z"],6));("a",(["a";"y"],7));("c",(["c";"k"],2))];;`

输出应该是

[("a",[(["a";"k"],5);(["a";"y"],7)]);("b",[(["b";"z"],6)]);("c",[(["c";"k"],2)])]

我试过了: datat |> List.map (fun (a,b) ->a,b );;

我试了很多次都得不到想要的output.I但是我failed.Thank提前求助

我认为您正在尝试按元组的第一项对项目进行分组。 所以你会做datat |> List.groupBy fst 这将为您提供预期的分组。

  [("a", [("a", (["a"; "k"], 5)); ("a", (["a"; "y"], 7))]);
   ("b", [("b", (["b"; "z"], 6))]); ("c", [("c", (["c"; "k"], 2))])]

然后您想要从每个分组条目中清除其先前 header 中的项目。因此,您将使用仅采用元组第二部分的函数进行映射。 List.map (fun (groupKey, groupedItems) -> groupKey, groupedItems |> List.map snd)

所以整行是datat |> List.groupBy fst |> List.map (fun (groupKey, groupedItems) -> groupKey, groupedItems |> List.map snd) 它将 returns

  [("a", [(["a"; "k"], 5); (["a"; "y"], 7)]); ("b", [(["b"; "z"], 6)]);
   ("c", [(["c"; "k"], 2)])]