我有两个整数列表(这里是1和0,但可以是任何整数):
List1 : [1; 1; 1; 1]
List2 : [0; 0; 1; 0]
Run Code Online (Sandbox Code Playgroud)
我想计算两个列表之间的值和位置的匹配数.因此,在这种情况下,在第3个位置只有一个匹配.
在C#中,我会使用for循环来解决这个问题,如下所示:
int matches = 0;
for (int i = 0; i < list1.Count; i++)
{
if (list1[i] == list2[i])
matches++;
}
Run Code Online (Sandbox Code Playgroud)
但我想知道在F#中是否有更好的方法.
我将如何做到这一点:
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
Run Code Online (Sandbox Code Playgroud)
这里是一种替代filter和length:
let sumMatches ns ms =
List.zip ns ms
|> List.filter (fun (n,m) -> n=m)
|> List.length
Run Code Online (Sandbox Code Playgroud)
如果您有非常大的列表,那么您应该
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
Run Code Online (Sandbox Code Playgroud)
如果你真的需要速度,那么你应该完全像在C#中一样(使用for循环和可变计数器)
但通常这没什么大不了的.