获取F#中两个整数列表之间的匹配数

时间:2015-11-24 19:29:36

标签: list f# c#-to-f#

我有两个整数列表(这里是1和0,但可以是任何整数):

List1 : [1; 1; 1; 1]
List2 : [0; 0; 1; 0]

我想计算两个列表之间的值和位置匹配数。因此,在这种情况下,在第3个位置只有一个匹配。

在C#中,我会使用for循环来解决这个问题,如下所示:

int matches = 0;
for (int i = 0; i < list1.Count; i++)
{
    if (list1[i] == list2[i])
        matches++;
}

但我想知道在F#中是否有更好的方法。

2 个答案:

答案 0 :(得分:6)

我将如何做到这一点:

let l1 = [1; 0; 1; 1];;                                                                               
let l2 = [0; 0; 1; 0];;                                                                               

let sumMatches ns ms = 
   List.zip ns ms 
   |> List.map (fun (n,m) -> if n=m then 1 else 0) 
   |> List.sum

> sumMatches l1 l2;;                                                               
val it : int = 2   

这是替代filterlength

let sumMatches ns ms = 
   List.zip ns ms 
   |> List.filter (fun (n,m) -> n=m) 
   |> List.length

备注

如果您有非常大的列表,那么您应该

  • 使用Seq.代替List.(因为List模块函数将创建中间列表)
  • 使用Seq.map2作为李建议

如此变体:

let sumMatches ns ms = 
   Seq.map2 (fun n m -> if n = m then 1 else 0) ns ms 
   |> Seq.sum 

如果你真的需要速度,那么你应该完全像在C#中一样(使用for循环和可变计数器)

但通常这没什么大不了的。

答案 1 :(得分:1)

替代方式 - 使用List.fold2:

let l1 = [1; 0; 1; 1]                                                                             
let l2 = [0; 0; 1; 0]

let sumMatches ns ms = List.fold2 (fun acc n m -> acc + if n = m then 1 else 0) 0 ns ms

sumMatches l1 l2  |> printfn "Count = %i"

打印:

Count = 2

链接:https://dotnetfiddle.net/pe9fOY