Python中使用functools.reduce时如何传递可迭代对象元素的索引?
在functools.reduce中传递元素索引的解决方案
核心思路:用enumerate绑定索引与元素
functools.reduce本身不直接提供元素索引,但可以通过enumerate(arr)将原数组转换为**(索引, 值)**的元组迭代器,这样每次reduce迭代时就能同时获取索引和对应元素,完全不需要全局变量。
方案1:调整目标函数参数适配元组
修改add函数,让它接收包含索引和值的元组参数,再结合functools.partial绑定max_index:
import functools def add(total, indexed_val, max_index): index, val = indexed_val return total + val if index <= max_index else total arr = [1,2,3,4,5,6,7,8] result = functools.reduce(functools.partial(add, max_index=5), enumerate(arr), 0) print(result) # 输出21(1+2+3+4+5+6的和)
方案2:用Lambda适配原函数(无需修改原函数)
如果不想改动原add函数的参数结构,可以用lambda表达式把enumerate生成的元组拆分为val和index,再传入原函数:
import functools def add(total, val, max_index, index): if index > max_index: return total else: return total + val arr = [1,2,3,4,5,6,7,8] result = functools.reduce( lambda total, idx_val: add(total, idx_val[1], max_index=5, index=idx_val[0]), enumerate(arr), 0 ) print(result) # 输出21
关于大数组的兼容性
enumerate返回的是迭代器,不会一次性将所有元素加载到内存中,因此即使处理非常大的数组,也不会有内存占用过高的问题,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Christopher Rae
相关产品推荐
相关产品推荐

