加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

获取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模块函数将创建中间列表)
>使用Seq.map2作为李建议

如此变体:

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读