获取F#中两个整数列表之间的匹配数
发布时间:2020-12-16 10:00:17 所属栏目:百科 来源:网络整理
导读:我有两个整数列表(这里是1和0,但可以是任何整数): List1 : [1; 1; 1; 1]List2 : [0; 0; 1; 0] 我想计算两个列表之间的值和位置的匹配数.因此,在这种情况下,在第3个位置只有一个匹配. 在C#中,我会使用for循环来解决这个问题,如下所示: int matches = 0;for
我有两个整数列表(这里是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 这里有一个过滤器和长度的替代方案: let sumMatches ns ms = List.zip ns ms |> List.filter (fun (n,m) -> n=m) |> List.length 备注 如果您有非常大的列表,那么您应该 >使用Seq.而不是列表. (因为List模块函数将创建中间列表) 如此变体: let sumMatches ns ms = Seq.map2 (fun n m -> if n = m then 1 else 0) ns ms |> Seq.sum 如果你真的需要速度,那么你应该完全像在C#中那样做(使用for循环和可变计数器) 但通常这没什么大不了的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |