F#转换和聚合列表列表

时间:2014-03-10 00:42:01

标签: f#

我有以下数据集

let results = [[true;false;true];[true;true;false];[false;false;false]]

我想把它变成

let summary = [2;1;1]

这可以用盒子做点什么吗?我在想List.Collect,但我无法让它工作。

提前致谢

1 个答案:

答案 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 (+))