2016-03-04 129 views
3

的名单列表我有一个数据集像这样转换逗号分隔的字符串列表,以整数

1,2 
3,4 
5,6 
7,8 
9,0 

当我使用ReadAllLines我得到一个字符串数组读取它。到目前为止,我已经转换的字符串列表数组包含字符串,如

[["1";"2"];["3";"4"]... etc 

我需要最后一步算一步吧,现在得到这个[[1;1;[1;4]... etc

我的代码:

module Data = 
    let load(path : string) (filename : string) = 
     System.IO.File.ReadAllLines(path + "\" + filename) 
     |> Array.toList 
     |> Seq.map (fun s -> s.Split [|','|] |> Array.toList) 
     |> Seq.map (fun s -> s |> Seq.map System.Int32.Parse) 

这是我测试它时返回的结果

val it : seq<seq<int>> = seq [seq [1; 2]; seq [3; 4]; seq [5; 6]] 

我在等待这样的事情

val zz : int list list = [[1; 2]; [3; 4]] 

回答

5

就快,现在你只需要序列的序列转换成列表的列表:

|> Seq.map Seq.toList 
|> Seq.toList 

,你可以删除线|> Array.toList这是在这种情况下更好地工作与序列,然后转换为列表作为最后一步。

另请注意,您可以使用System.IO.Path.Combine(path, filename),它将处理为您合并路径和文件名的逻辑。

最后有一些重构,你可以这样做:

|> Seq.map (fun s -> s |> Seq.map System.Int32.Parse) 

应用eta reduction可以删除拉姆达:

|> Seq.map (Seq.map System.Int32.Parse) 

然后

|> Seq.map (fun s -> s.Split [|','|] |> Array.toList) 
|> Seq.map (fun s -> s |> Seq.map System.Int32.Parse) 
|> Seq.map Seq.toList 

可以简化为一个单一的map因为x |> map f |> map g等于x |> map (f >> g)

|> Seq.map ((fun s -> s.Split [|','|]) >> Seq.map System.Int32.Parse >> Seq.toList) 

消除括号:

|> Seq.map (fun s -> s.Split [|','|] |> Seq.map System.Int32.Parse |> Seq.toList) 

可以去除中间值lines并键入注释因为Combine预计两个字符串。下面是完整的代码:

open System 
module Data = 
    let load path filename = 
     IO.File.ReadAllLines(IO.Path.Combine(path, filename)) 
      |> Seq.map (fun s -> s.Split [|','|] |> Seq.map Int32.Parse |> Seq.toList) 
      |> Seq.toList 
3

使用List.map而不是Seq.map:在这两个

[|"1,2"; "3,4"; "5,6"; "7,8"; "9,0"|] 
|> Array.toList 
|> List.map (fun s -> s.Split [|','|] |> Array.toList |> List.map System.Int32.Parse) 

结果:

[|"1,2"; "3,4"; "5,6"; "7,8"; "9,0"|] 
|> Array.toList 
|> List.map (fun s -> s.Split [|','|] |> Array.toList) 
|> List.map (fun s -> s |> List.map System.Int32.Parse) 

既然你在一排有两个map S,你可以将它们组合案例:

> 
val it : int list list = [[1; 2]; [3; 4]; [5; 6]; [7; 8]; [9; 0]] 
相关问题