【问题标题】:F#: List and tuple How can i obtain the desired output?F#:列表和元组我如何获得所需的输出?
【发布时间】:2021-01-18 06:47:10
【问题描述】:

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

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

那么 输出 应该返回
(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 );;

我无法获得所需的输出。我尝试了很多次,但都失败了。提前感谢您的帮助

【问题讨论】:

    标签: f# f#-interactive


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-16
      • 2012-11-15
      • 2016-08-22
      • 1970-01-01
      • 2021-05-07
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多