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