如何在F#中实现子列表对应元素相加?示例:[[10;2;10];[10;50;10]]→[20;52;20]
在F#中实现子列表对应元素相加的几种方法
刚好之前也处理过类似的需求,给你分享几个实用的实现方式:
方法一:针对两个子列表的简单实现
如果你的需求只需要处理两个子列表,用List.zip配合List.map就能轻松搞定:
let addTwoSublists listA listB = List.zip listA listB |> List.map (fun (x, y) -> x + y) // 代入你的测试案例 let testInput = [[10;2;10];[10;50;10]] addTwoSublists testInput.[0] testInput.[1] // 输出 [20;52;20]
List.zip会把两个列表中对应位置的元素配对成元组,之后我们只需要对每个元组执行加法操作就行。
方法二:支持任意数量子列表的通用实现
如果以后需要处理更多子列表(比如3个、4个),推荐用List.transpose来转置列表,再对每个转置后的子列表求和,这个方法更通用:
let addCorrespondingElements sublists = sublists |> List.transpose |> List.map List.sum // 直接测试你的案例 addCorrespondingElements [[10;2;10];[10;50;10]] // 直接得到 [20;52;20]
List.transpose的作用是把二维列表的行和列互换,比如你的输入转置后会变成[[10;10];[2;50];[10;10]],之后每个子列表求和就是对应位置的元素相加,完美匹配你的需求。
可选:添加长度检查的安全版本
如果担心输入的子列表长度不一致(这种情况List.transpose会抛出异常),可以加个前置检查:
let addCorrespondingElementsSafe sublists = let uniqueLengths = sublists |> List.map List.length |> List.distinct if uniqueLengths.Length <> 1 then failwith "所有子列表的长度必须相同哦" else sublists |> List.transpose |> List.map List.sum
内容的提问来源于stack exchange,提问作者Shiro Pie
相关产品推荐
相关产品推荐

