Haskell合并元组与整数列表 计算分数总和平均值及优化方法
实现方案
1. 按你现有思路实现列表合并
你当前拆分计算的方式可以用zipWith3完成三个列表的拼接,注意要先修正平均分计算逻辑:原来的div是整数除法,无法得到小数结果,调整后的代码如下:
-- 修正平均分计算,保留两位小数 avgList = map (\x -> fromIntegral (round $ fromIntegral x / 3 * 100) / 100) newList originalList = [("Tom", 87, 78, 67), ("Dick", 56, 45, 72)] finalList = zipWith3 (\(name, m1, m2, m3) total avg -> (name, m1, m2, m3, total, avg)) originalList newList avgList
2. 更高效的实现方式
你当前的写法需要遍历列表3次(计算总分、计算平均分、合并列表),还需要额外存储两个中间列表,最优的方案是一次遍历直接构造最终结果,不需要中间变量:
processScores :: [(String, Int, Int, Int)] -> [(String, Int, Int, Int, Int, Double)] processScores = map (\(name, m1, m2, m3) -> let total = m1 + m2 + m3 avg = fromIntegral total / 3 roundedAvg = fromIntegral (round $ avg * 100) / 100 -- 保留两位小数 in (name, m1, m2, m3, total, roundedAvg)) -- 直接调用得到目标结果 finalList = processScores [("Tom", 87, 78, 67), ("Dick", 56, 45, 72)]
这种写法只需要遍历一次列表,空间和时间效率都更高,代码逻辑也更紧凑,不需要维护多个中间列表。
额外建议
如果后续可能调整科目数量,建议把分数存在列表中而非固定长度的元组,比如存储格式改为(String, [Int]),计算总分可以直接调用内置的sum函数,不需要手动适配科目数量。
内容的提问来源于stack exchange,提问作者radhika iyer
相关产品推荐
相关产品推荐

