Arrays F-将多个列字符串列表合并到数组中

Arrays F-将多个列字符串列表合并到数组中,arrays,list,f#,Arrays,List,F#,我有许多列字符串列表11,我想将它们组合成一个数组: [List1] Alpha Bravo Charlie [List2] 3 5 7 [List3] 11 13 17 要导出到csv文件,请执行以下操作: [Array] Alpha 3 11 Bravo 5 13 Charlie 7 17 这可能吗?如果可能的话,怎么可能?是的,基本上你想转置。您可以编写自己的函数,也可以使用矩阵库或Deedle中的内容。这是很容易做到的与一个理解以及。您需要首先将列

我有许多列字符串列表11,我想将它们组合成一个数组:

[List1]
Alpha
Bravo
Charlie

[List2]
3
5
7

[List3]
11
13
17
要导出到csv文件,请执行以下操作:

[Array]
Alpha     3   11
Bravo     5   13
Charlie   7   17

这可能吗?如果可能的话,怎么可能?

是的,基本上你想转置。您可以编写自己的函数,也可以使用矩阵库或Deedle中的内容。这是很容易做到的与一个理解以及。您需要首先将列表中的所有元素映射为字符串。最后使用String.concat连接数组的元素:

let list1 = ["Alpha";"Bravo";"Charlie"]
let list2 = ["3";"5";"7"]
let list3 = ["11";"13";"17"]

let lists = [list1;list2;list3] // create a list of lists

[|for i in [0 .. (lists.Length - 1)] do
    for j in [0 .. (lists.[i].Length - 1)] do 
    yield lists.[j].[i] // swap rows and columns
|] 
|> Array.splitInto (lists.Length) // 
|> Array.map (fun x -> String.concat "," x) // join the array elements with a comma for CSV output. 
输出:

// val it : string [] = [|"Alpha,3,11"; "Bravo,5,13"; "Charlie,7,17"|]
之后,您可以使用File.writeAllines或类似方法将其转储到文件中

编辑: 让我们添加列表4:

let list4 = ["19";"23";"29"]
let lists = [list1;list2;list3;list4]
如果你想一想,你会发现你想要每个列表的第一个元素,基本上是它的头:

lists
|> List.map List.head
//val it : string list = ["Alpha"; "3"; "11"; "19"]
现在,如果您可以在获取头部后,通过列表的剩余部分执行此函数,则尾部将保留,因此对于下一行:

lists 
|> List.map List.tail
|> List.map List.head
//val it : string list = ["Bravo"; "5"; "13"; "23"]
现在,如果您可以重复此操作,直到列表用完…您实际上可以,通过递归:

let rec transpose xs =
    match xs with
    []::xs -> []
    | xs -> List.map List.head xs :: transpose (List.map List.tail xs)

transpose lists
|> Array.ofList
|> Array.map (fun x -> String.concat "," x)

//val it : string list list =
//[["Alpha"; "3"; "11"; "19"]; ["Bravo"; "5"; "13"; "23"];
// ["Charlie"; "7"; "17"; "29"]]

//val it : string [] =  [|"Alpha,3,11,19"; "Bravo,5,13,23"; "Charlie,7,17,29"|]

这个问题的哪一部分你还没解决?John,第一部分-将列列表组合成一个数组?提示:寻找转置函数。如果您编写您期望的输入和输出的签名,这将有所帮助。如果我添加另一个列表,它似乎会失败-let list4=[19;23;29]!我遗漏了什么吗?@matekus是的,你会得到一个索引越界错误。这就是为什么使用位置索引不是一个好主意。不过,指出它是如何失败的是很有帮助的。我将添加一个使用递归的版本,如果你能用折叠的方式重写它,那就太好了-