前几天我问过如何通过将其中一个元素分组到数组(F#: Reduce a list of tuples by grouping one of the elements into arrays)来减少元组列表。我现在想学习如何做到与此相反。让我说我有这个:
(" A",[" B";" C&#34 ;;" D&#34 ;;" E"] )
我希望得到这个:
[(" A"," B"); (" A"," C"); (" A"," D"); (" A"," E")]
这样做的功能方法是什么?我怎么能用附加的这种类型的元素列表呢?我试过了:
让prb =(" A",[" B";" C&#34 ;;" D&#34 ;;" E&# 34;])|> [对于我在snd - > (fst,i)]
但还没有奏效。
非常感谢您的回答!我是F#的新手,如果这是非常基本的话,我很抱歉
答案 0 :(得分:3)
您可以在List.map
上使用snd source
:
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")]
答案 1 :(得分:0)
作为使用List.map
的替代方法,您还可以使用列表推导。对于简单的转换,这通常是我的首选,但这只是风格问题,所以Marcin的答案非常好。
完成的版本如下所示:
let collectTuple (key, values) =
[ for v in values -> key, v ]
在您尝试的解决方案中,您尝试使用fst
和snd
来访问元组的元素,这也是有效的:
let collectTuple input =
[ for v in snd input -> fst input, v ]