Kotlin中是否有函数式方法将列表转换为相邻元素和列表?
用函数式方法实现列表相邻元素求和
针对你提到的需求,其实不用局限在reduce/fold本身,函数式编程里有更直接的实现方式;如果一定要用reduce/fold,也可以通过调整累积值的结构来解决重叠元素对的问题。
方法1:zip + map(最直观的函数式实现)
把原列表和它的切片(从第二个元素开始)配对,再对每一对元素执行求和操作:
nums = [1, 2, 5, 2] result = list(map(lambda a, b: a + b, nums, nums[1:])) # 输出: [3, 7, 7]
原理是zip(nums, nums[1:])会生成(1,2), (2,5), (5,2)这样的元组对,map遍历这些元组并计算和,最后转成列表即可。这种方式完全符合函数式风格,简洁高效。
方法2:用reduce/fold实现
如果一定要基于reduce实现,可以让累积值同时保存前一个元素和已生成的结果列表,每次迭代时计算当前元素与前一个元素的和,追加到结果列表中:
from functools import reduce nums = [1, 2, 5, 2] if len(nums) < 2: result = [] else: _, result = reduce( lambda acc, curr: (curr, acc[1] + [acc[0] + curr]), nums[1:], (nums[0], []) ) # 输出: [3, 7, 7]
这里的初始累积值是(nums[0], [])——第一个元素是原列表的首元素(作为“前一个元素”),第二个是空列表(用于存储结果)。每次迭代时,用累积的前一个元素和当前元素求和,把结果追加到结果列表,同时更新累积的前一个元素为当前元素。最后忽略累积的前一个元素,取出结果列表即可。
注意:若原列表长度小于2,直接返回空列表避免报错。
内容的提问来源于stack exchange,提问作者Alexander Ites
相关产品推荐
相关产品推荐

