【问题标题】:F#: Expand a list of tuples of form (string*string list) list using a keyF#:使用键展开表单(字符串*字符串列表)列表的元组列表
【发布时间】:2014-10-17 09:02:05
【问题描述】:

前几天我问如何通过将其中一个元素分组到数组中来减少元组列表 (F#: Reduce a list of tuples by grouping one of the elements into arrays)。我现在想学习如何做相反的事情。假设我有这个:

("A", ["B"; "C"; "D"; "E"])

我想得到这个:

[("A", "B") ; (“A”,“C”); (“广告”) ; ("A" , "E")]

执行此操作的功能性方法是什么?如何使用要附加的这种类型的元素列表来做到这一点?我试过了:

let prb = ("A", ["B"; "C"; "D"; "E"]) |> [for i in snd -> (fst, i)]

但是没有用。

非常感谢您的回答!我是 F# 的新手,如果这真的很基础,我很抱歉

【问题讨论】:

    标签: list f# tuples


    【解决方案1】:

    除了使用List.map,您还可以使用列表推导。对于简单的转换,这通常是我的首选,但这实际上只是风格问题,所以 Marcin 的回答非常好。

    完成后的版本如下:

    let collectTuple (key, values) = 
      [ for v in values -> key, v ]
    

    在您尝试的解决方案中,您尝试使用 fstsnd 访问元组的元素,这也有效:

    let collectTuple input = 
      [ for v in snd input -> fst input, v ]
    

    【讨论】:

    • 我们的解决方案之间会有性能差异吗?
    【解决方案2】:

    您可以在snd source 上使用List.map

    let source = ("A", ["B"; "C"; "D"; "E"]);;
    
    // val source : string * string list = ("A", ["B"; "C"; "D"; "E"])
    
    let result = snd source |> List.map (fun x -> fst source, x);;
    
    // val result : (string * string) list =
    //    [("A", "B"); ("A", "C"); ("A", "D"); ("A", "E")]
    

    更新

    这些元素的列表

    let source = [("A", ["B"; "C"; "D"; "E"]);("A", ["B"; "C"; "D"; "E"]);("A", ["B"; "C"; "D"; "E"])];;
    
    // val source : (string * string list) list =
    //   [("A", ["B"; "C"; "D"; "E"]); ("A", ["B"; "C"; "D"; "E"]);
    //    ("A", ["B"; "C"; "D"; "E"])]
    

    你可以用上面的代码声明一个函数

    let collectTuple (x, items) = items |> List.map (fun y -> x, y);;
    
    // val collectTuple : x:'a * items:'b list -> ('a * 'b) list
    

    并用它来调用List.map:

    let result = source |> List.map collectTuple;;
    
    // val result : (string * string) list list =
    //   [[("A", "B"); ("A", "C"); ("A", "D"); ("A", "E")];
    //    [("A", "B"); ("A", "C"); ("A", "D"); ("A", "E")];
    //    [("A", "B"); ("A", "C"); ("A", "D"); ("A", "E")]]
    

    List.collect,如果您只想要一个元组列表:

    let result = source |> List.collect collectTuple;;
    
    // val result : (string * string) list =
    //   [("A", "B"); ("A", "C"); ("A", "D"); ("A", "E"); ("A", "B"); ("A", "C");
    //    ("A", "D"); ("A", "E"); ("A", "B"); ("A", "C"); ("A", "D"); ("A", "E")]
    

    【讨论】:

    • 非常棒,完美运行!非常感谢!
    • 尽管如此,我如何才能为这些元素的列表执行此操作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2014-08-30
    • 2013-09-04
    • 2021-02-27
    • 1970-01-01
    • 2020-09-04
    相关资源
    最近更新 更多