我有以下数据集
let results = [[true;false;true];[true;true;false];[false;false;false]]
Run Code Online (Sandbox Code Playgroud)
我想把它变成
let summary = [2;1;1]
Run Code Online (Sandbox Code Playgroud)
这个盒子可以做些什么吗?我在想List.Collect,但我无法让它工作.
提前致谢
根据您的示例,我想您要true分别对输入列表的第1个,第2个,第3个等元素中的值的数量求和.
一种方法是将布尔列表转换为包含1或0的数字列表,然后聚合列表.因此,对于您的输入,带有数字的列表将是:
[[1; 0; 1]; [1; 1; 0]; [0; 0; 0]]
Run Code Online (Sandbox Code Playgroud)
这个我们可以很容易地使用嵌套List.map:
results |> List.map (List.map (fun b -> if b then 1 else 0))
Run Code Online (Sandbox Code Playgroud)
现在您只需要压缩列表并添加相应的数字.鉴于前两个列表,您可以使用List.map2以下方法执行此操作:
List.map2 (+) [1; 0; 1] [1; 1; 0] = [2; 1; 1]
Run Code Online (Sandbox Code Playgroud)
整个事情可以使用部分应用程序编写为一个很好的管道:
results
|> List.map (List.map (fun b -> if b then 1 else 0))
|> List.reduce (List.map2 (+))
Run Code Online (Sandbox Code Playgroud)