如何使用map处理嵌套元组列表以计算子列表数值总和
问题原因与代码调整方案
之前写出的代码核心问题是过早用concat打散了原列表的层级绑定关系,把和每个内层列表绑定的外层键(类似(1,1)的二元组)直接丢弃,最终得到的是脱离结构的纯一维数值列表。
实现思路
这个需求不需要跨元素拼接列表,也不需要用到筛选逻辑(filter在这里没有适用场景),只需要对原列表的每个独立元素单独做处理即可:
- 原列表每个元素的固定结构是:
(外层键, 内层元组列表) - 对每个元素单独提取内层列表的所有数值分量,求和后和原外层键重新组成新的二元组,即可得到目标结构。
可直接运行的代码
map (\(outerKey, innerItems) -> (outerKey, sum $ map snd innerItems)) list
执行逻辑拆解
- 遍历原列表时逐个匹配每个元素的两个组成部分:外层键、内层元组列表,不会跨元素把内容拼合到一起
- 对单个元素的内层元组列表,用
map snd提取所有第二个位置的数值分量 - 用内置的
sum函数对提取到的数值直接求和 - 将求和结果和对应的原外层键组合为新的二元组,最终输出结构为:
[((1,1),10), ((2,2),2), ((3,3),3)]
注:示例目标输出里最后多了一个多余的右括号,属于笔误,实际代码运行不会生成这种语法不合法的结构。
现有代码的执行路径问题:
- 对原列表执行
map snd,取出每个元素的内层列表,得到嵌套的列表结构[[("A", 1), ("D", 4), ("E", 5)], [("B", 2)], [("C",3)]]- 执行
concat把所有嵌套的内层列表拼成一个无层级的大列表,直接切断了每个数值和对应外层键的绑定关系- 最后对拼合后的大列表执行
map snd提取数值,自然就只能得到没有任何结构的[1,4,5,2,3]
内容的提问来源于stack exchange,提问作者user11546270
相关产品推荐
相关产品推荐

