reduce函数及其用法

 reduce方法在平时用的比较少,最近整理数组去重觉得它还是挺好用的,然而它还有好多功能,下面就梳理一下它都有哪些用法。

一、mdn给的解释:

reduce() 方法对数组中的每个元素按序执行一个由您提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。

提取一下:

1. 为数组的每个值从左到右执行提供的函数;

2. 将数组缩减为单个值(函数遍历整个数组后的结果)。

二、语法:

 arr.reduce(callback,[initialValue])

initialValue 可选,指定了初始值 initialValue,则起始索引号为 0(从初始值开始计算),否则从索引 1 起始(从数组第一个元素开始计算)。

三、用法

1. 求和 / 求积

let arr=[1,2,3,4]
arr.reduce((x,y)=>x+y);  //10
arr.reduce((x,y)=>x*y);  //24

2. 对象里属性求和/求积


var result = [
    {
        subject: 'math',
        score: 10,
        num1:1,
        num2:8,
        num3:10,

    },
    {
        subject: 'chinese',
        score: 20,
        num1:4,
        num2:5,
        num3:6,
    },
];
 
//单个key求和
result.reduce(function(prev, cur) {
    return cur.score + prev; //和
    return cur.score * prev; //积
}, 0);  //30


//多个key求和
result.reduce(function(prev, cur) {
    Object.key(prev).foreach((e)=>(prev[e]+=cur[e]))
    return prev;
},{num1:0,num2:0,num3:0});  //{num1:5,num2:13,num3:16}

3. 计算数组中每个元素出现的次数


let arr= ['x', 'y', 'z','y'];

arr.reduce((pre,cur)=>{
    if(cur in pre){
        pre[cur]++;
    }else{
        pre[cur]=1;
    }
    return pre;
},{});  //{x:1,y:2,z:1}

4. 将二维数组转化为一维数组 / 将多维数组转化为一维数组

let arr = [[1, 2], [2, 4]]
arr.reduce((pre,cur)=>{
    return pre.concat(cur); 
},[])  //[1, 2, 2, 4]

let arr = [[1, 2], [[3,4], 4]]
const newArr = function(arr){
   return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
}   //[1, 2, 3, 4, 4]

5. 数组去重 / 对象数组去重

//数组
let arr = [1,2,3,3,1]
let newArr = arr.reduce((pre,cur)=>{
    if(!pre.includes(cur)){
      return pre.concat(cur)
    }else{
      return pre
    }
},[]) // [1, 2, 3]

//对象数组
let arr = [
   {name: 'x', id:1},
   {name: 'y', id:2},
   {name: 'z', id:1},
]
let obj = {}
let newArr = arr.reduce((item, next)=>{
   obj[next.id] ? "" : (obj[next.id] = true && item.push(next));
   return item;
},[]) // [{name: 'x', id:1}, {name: 'y', id:2}]

<think> 我们首先需要讲解Python中的map和reduce函数,包括它们的使用方法、应用场景,并给出代码示例。然后按照要求提出相关问题。 ### 1. map函数 **功能**:`map()` 函数将一个函数应用于一个可迭代对象(如列表、元组等)的所有元素,并返回一个迭代器(在Python 3中),其中包含所有经过该函数处理后的结果。 **语法**: ```python map(function, iterable, ...) ``` - `function`:函数,可以是内置函数、lambda函数或自定义函数。 - `iterable`:一个或多个可迭代对象。 **特点**: - 惰性求值:在Python 3中返回迭代器,需要转换为列表等才能获取所有值。 - 支持多个可迭代对象:当有多个可迭代对象时,函数应接受相应数量的参数,并行地从每个可迭代对象中取出元素作为函数的参数。 #### 示例代码: ```python # 示例1:将列表中的每个元素平方 numbers = [1, 2, 3, 4] squared = map(lambda x: x**2, numbers) print(list(squared)) # 输出: [1, 4, 9, 16] # 示例2:将两个列表对应位置相加 list1 = [1, 2, 3] list2 = [4, 5, 6] result = map(lambda x, y: x + y, list1, list2) print(list(result)) # 输出: [5, 7, 9] # 示例3:使用内置函数 str_nums = ['1', '2', '3'] int_nums = map(int, str_nums) print(list(int_nums)) # 输出: [1, 2, 3] ``` ### 2. reduce函数 **功能**:`reduce()` 函数位于`functools`模块中,它会对序列中的元素进行累积操作,即将一个二元函数作用于序列的元素,从左到右,将结果累积为单个值。 **语法**: ```python from functools import reduce reduce(function, sequence[, initial]) ``` - `function`:一个有两个参数的函数,该函数会先作用于序列的前两个元素,然后将结果与下一个元素作用,依此类推。 - `sequence`:可迭代对象。 - `initial`(可选):初始值,如果提供,则首先将初始值与序列的第一个元素作为参数传递给函数。 #### 示例代码: ```python from functools import reduce # 示例1:计算列表元素的乘积 numbers = [1, 2, 3, 4] product = reduce(lambda x, y: x * y, numbers) print(product) # 输出: 24 # 示例2:计算列表元素之和(带初始值) total = reduce(lambda x, y: x + y, numbers, 10) # 从10开始累加 print(total) # 输出: 20 (10+1+2+3+4) # 示例3:将字符串列表拼接成一个字符串 words = ['Hello', 'World', '!'] sentence = reduce(lambda s1, s2: s1 + ' ' + s2, words) print(sentence) # 输出: 'Hello World !' ``` ### 应用场景对比: | 函数 | 典型应用场景 | 优点 | 缺点 | |--------|------------------------------------------|--------------------------|--------------------------| | `map` | 数据转换(类型转换、数值计算等) | 简洁,并行处理多个可迭代 | 结果需转换为列表获取 | | `reduce`| 累积计算(求和、求积、拼接等) | 可实现复杂累积逻辑 | 需要导入,可读性可能降低 | ### 结合使用map和reduce的例子(模拟MapReduce): ```python from functools import reduce # 统计一段文本中各单词的长度,然后求和 text = "Python map and reduce functions" words = text.split() # Map阶段:将每个单词映射为其长度 word_lengths = map(len, words) # Reduce阶段:将所有长度相加 total_length = reduce(lambda x, y: x + y, word_lengths) print(f"文本总长度(不含空格): {total_length}") # 输出: 28(5+3+3+9) ``` ### 注意事项: - `map`在Python 3中返回迭代器,因此只迭代一次,再次使用需要重新生成。 - `reduce`在Python 3中被移到了`functools`模块,需要导入。 - 使用`reduce`时,注意初始值的设置,避免空序列时出错(空序列必须提供初始值,否则抛出`TypeError`)。 --- §§相关问题§§: 1. Python中的`filter`函数如何使用?与`map`有何区别? 2. 如何用`reduce`实现找出列表中的最大值? 3. 在Python 3中,为什么`map`和`filter`返回的是迭代器而不是列表? 4. 请举例说明如何使用`map`处理多个可迭代对象? </think> ### Python的`map`与`reduce`函数详解 `map`和`reduce`是Python函数式编程的核心函数,用于高效处理集合数据。两者都接受函数作为参数,但有不同的应用场景和运行机制。 #### 1. `map`函数:数据转换器 **功能**:将函数应用于可迭代对象的每个元素,返回新迭代器 **语法**: ```python map(function, iterable, ...) ``` **应用场景**: - 批量处理数据 - 类型转换 - 并行处理多个可迭代对象 **示例代码**: ```python # 示例1:数值转换 numbers = [1, 2, 3, 4] squared = map(lambda x: x**2, numbers) print(list(squared)) # [1, 4, 9, 16] # 示例2:多参数处理 names = ["Alice", "Bob"] ages = [25, 30] combined = map(lambda n, a: f"{n} is {a} years old", names, ages) print(list(combined)) # ['Alice is 25 years old', 'Bob is 30 years old'] # 示例3:类型转换 str_nums = ["1", "2", "3"] int_nums = map(int, str_nums) print(sum(int_nums)) # 6 ``` **特性**: - 惰性求值(Python 3返回迭代器) - 支持多个可迭代对象(并行处理) - 比列表推导式更节省内存 #### 2. `reduce`函数:数据聚合器 **功能**:将二元函数作用于序列元素进行累积计算 **语法**(需从`functools`导入): ```python from functools import reduce reduce(function, iterable[, initializer]) ``` **应用场景**: - 计算累积值(乘积、总和) - 查找最大/最小值 - 复杂数据聚合 **示例代码**: ```python from functools import reduce # 示例1:计算乘积 numbers = [2, 3, 4] product = reduce(lambda x, y: x * y, numbers) print(product) # 24 # 示例2:查找最大值 values = [47, 11, 42, 13] max_value = reduce(lambda a, b: a if a > b else b, values) print(max_value) # 47 # 示例3:嵌套字典合并 dicts = [{'a': 1}, {'b': 2}, {'a': 3, 'c': 4}] merged = reduce(lambda d1, d2: {**d1, **d2}, dicts) print(merged) # {'a': 3, 'b': 2, 'c': 4} ``` **特性**: - 需要从`functools`导入(Python 3) - 可指定初始值(`initializer`参数) - 函数必须接受两个参数 - 处理过程:`f(f(f(a,b),c),d)` ### 对比总结 | 特性 | `map` | `reduce` | |--------------|-------------------------------|------------------------------| | **输入输出** | 1函数+N可迭代 → 新迭代器 | 1函数+1序列 → 单个值 | | **内存效率** | 高(惰性求值) | 依赖实现 | | **典型应用** | 数据转换、清洗 | 聚合计算、累积操作 | | **替代方案** | 列表推导式 | 循环累加、sum/max/min等函数 | | **导入要求** | 内置无需导入 | 需`from functools import reduce` | ### 实际应用场景 ```python # 电商订单处理示例 orders = [ {"items": 2, "price": 100}, {"items": 1, "price": 200}, {"items": 3, "price": 50} ] # 使用map计算每个订单总额 order_totals = map(lambda o: o["items"] * o["price"], orders) # 使用reduce计算总销售额 total_sales = reduce(lambda acc, val: acc + val, order_totals, 0) print(f"总销售额: ${total_sales}") # 总销售额: $450 ``` ### 注意事项 1. **惰性求值处理**:Python 3中`map`返回迭代器,需转换为列表或使用`next()` 2. **空序列处理**:`reduce`空序列需提供`initializer`,否则报错 3. **函数复杂度**:避免在`map/reduce`中使用复杂函数影响可读性 4. **替代方案**:简单场景优先使用列表推导式或内置函数(如`sum()`) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值