gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:53:11 25 4
gpt4 key购买 nike

我有两个整数列表(这里是 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# 中是否有更好的方法。

最佳答案

下面是我的做法:

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 模块函数将创建中间列表)
  • 按照 Lee 的建议使用 Seq.map2

在这个变体中:

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

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

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

关于list - 获取 F# 中两个整数列表之间的匹配数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33902189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com