鱼C论坛

 找回密码
 立即注册
查看: 2938|回复: 16

[已解决]map()函数和filter()区别和用法

[复制链接]
发表于 2022-3-18 21:54:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
0.
list(map(sum,[0,1,2]))
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    list(map(sum,[0,1,2]))
TypeError: 'int' object is not iterable
请问为什么会报错,[0,1,2]不是可迭代对象么?
list(map(sum,[0,1],[1,2]))
Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    list(map(sum,[0,1],[2,3]))
TypeError: 'int' object is not iterable
可以用map求[sum([0,2]),sum([1,3])]吗?
1.
list(filter(pow,[2,3,5],[5,2,3]))
Traceback (most recent call last):
  File "<pyshell#26>", line 1, in <module>
    list(filter(pow,[2,3,5],[5,2,3]))
TypeError: filter expected 2 arguments, got 3
filter()和map()的区别是在于filter是把结果中的False过滤掉,
filter返回结果为真的元素,map返回运算结果
为什么报错原因是要求期望两个参数但是返回三个?
list(filter(max,[1,2],[3,4]))
Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    list(filter(max,[1,2],[3,4]))
TypeError: filter expected 2 arguments, got 3

小甲鱼说这两个函数特别重要,请求各位前辈指引,晚辈感激不尽
最佳答案
2022-3-19 10:48:41
本帖最后由 hrpzcf 于 2022-3-19 11:01 编辑
李二蛋 发表于 2022-3-19 09:43
0.
b是一个列表,将b的每一项作为参数放入函数a中
那么相对于函数是pow,max此类需要可迭代对象是多列 ...


map和filter功能、如何传参你都没理解

功能:
1)map(func, [a, b, c, d...]) --> 返回 [func(a), func(b), func(c), func(d)...] (它返回的不是列表,而是生成器,要用list函数把生成器转换为列表或者对生成器for循环等,我这里写返回列表是方便理解)

2)filter(func, [a, b, c, d...]) --> func(a), func(b), func(c), func(d)... --> 只取[a, b, c, d...]中经func调用后为True的,比如 func(b), func(c) 结果都是True,那么filter返回结果就是 [b, c](它返回的不是列表,而是迭代器,要用list函数把生成器转换为列表或者对生成器for循环等,我这里写返回列表是方便理解)

待续....


传参:
你的代码:list(filter(max, [1, 3, 5], [2, 2, 2], [3, 9, 8]))
你是想max([1, 3, 5]), max([2, 2, 2]), max([3, 9, 8])?
首先你传了max, [1, 3, 5], [2, 2, 2], [3, 9, 8]  4个参数给filter,这就是错的,filter只接受2个参数
给[1, 3, 5], [2, 2, 2], [3, 9, 8]套上一层括号不就变一个参数了吗?max, [[1, 3, 5], [2, 2, 2], [3, 9, 8]] 不就变两个参数了吗?[[1, 3, 5], [2, 2, 2], [3, 9, 8]]共3项,把每一项传给max不就分别是max([1, 3, 5]), max([2, 2, 2]), max([3, 9, 8])了吗?
filter会把[[1, 3, 5], [2, 2, 2], [3, 9, 8]] 中经过max([1, 3, 5]), max([2, 2, 2]), max([3, 9, 8])后结果是True的项选出来,max([1, 3, 5]), max([2, 2, 2]), max([3, 9, 8])结果分别是5, 2, 9,都非0,都可判定是True,所以filter选出来的项分别就是[1, 3, 5], [2, 2, 2], [3, 9, 8],结果就是[[1, 3, 5], [2, 2, 2], [3, 9, 8]]
(我不理解你想达到什么目的)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-18 22:04:38 | 显示全部楼层
>>> list(map(sum,([0,1],[1,2])))
[1, 3]
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-18 22:44:44 | 显示全部楼层

请问为什么要加括号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-18 22:53:24 | 显示全部楼层
李二蛋 发表于 2022-3-18 22:44
请问为什么要加括号

map(a, b),a是函数,b是可迭代对象
map会将可迭代对象“b”的每一项作为参数放入函数“a”执行
这里你的函数“a”是sum,,而sum又是要求参数是可迭代对象,所以相当于要求b中的每一项都是可迭代对象
所以b写成([0, 1], [1, 2])或者[ [0, 1], [1, 2] ]等等都可以,map会将[0, 1]和[1, 2]分别放入sum计算,即sum([0, 1])...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-19 09:43:18 | 显示全部楼层
hrpzcf 发表于 2022-3-18 22:53
map(a, b),a是函数,b是可迭代对象
map会将可迭代对象“b”的每一项作为参数放入函数“a”执行
这里 ...

0.
b是一个列表,将b的每一项作为参数放入函数a中
那么相对于函数是pow,max此类需要可迭代对象是多列表的情况
b是多个列表,取多个列表的每一项拼接成参数放入函数a中
可以这样理解嘛
1.
>>> list(filter(max, [1, 3, 5], [2, 2, 2], [3, 9, 8]))
Traceback (most recent call last):
  File "<pyshell#55>", line 1, in <module>
    list(filter(max, [1, 3, 5], [2, 2, 2], [3, 9, 8]))
TypeError: filter expected 2 arguments, got 4
>>> list(filter(pow, [1, 3, 5], [2, 2, 2]))
Traceback (most recent call last):
  File "<pyshell#56>", line 1, in <module>
    list(filter(pow, [1, 3, 5], [2, 2, 2]))
TypeError: filter expected 2 arguments, got 3

请问前辈filter()是不是无法进行都多列表的运算?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-19 10:01:00 From FishC Mobile | 显示全部楼层
map()
有若干个元素,经过一个函数/方法,变成另外一个元素:
a, b, c -------> 函数 ---------> x, y, z

filter()
有若干个元素,经过一个函数/方法,只挑选出符合条件的元素:

a, b, c -------> 函数 --------> a, c
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-19 10:48:41 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hrpzcf 于 2022-3-19 11:01 编辑
李二蛋 发表于 2022-3-19 09:43
0.
b是一个列表,将b的每一项作为参数放入函数a中
那么相对于函数是pow,max此类需要可迭代对象是多列 ...


map和filter功能、如何传参你都没理解

功能:
1)map(func, [a, b, c, d...]) --> 返回 [func(a), func(b), func(c), func(d)...] (它返回的不是列表,而是生成器,要用list函数把生成器转换为列表或者对生成器for循环等,我这里写返回列表是方便理解)

2)filter(func, [a, b, c, d...]) --> func(a), func(b), func(c), func(d)... --> 只取[a, b, c, d...]中经func调用后为True的,比如 func(b), func(c) 结果都是True,那么filter返回结果就是 [b, c](它返回的不是列表,而是迭代器,要用list函数把生成器转换为列表或者对生成器for循环等,我这里写返回列表是方便理解)

待续....


传参:
你的代码:list(filter(max, [1, 3, 5], [2, 2, 2], [3, 9, 8]))
你是想max([1, 3, 5]), max([2, 2, 2]), max([3, 9, 8])?
首先你传了max, [1, 3, 5], [2, 2, 2], [3, 9, 8]  4个参数给filter,这就是错的,filter只接受2个参数
给[1, 3, 5], [2, 2, 2], [3, 9, 8]套上一层括号不就变一个参数了吗?max, [[1, 3, 5], [2, 2, 2], [3, 9, 8]] 不就变两个参数了吗?[[1, 3, 5], [2, 2, 2], [3, 9, 8]]共3项,把每一项传给max不就分别是max([1, 3, 5]), max([2, 2, 2]), max([3, 9, 8])了吗?
filter会把[[1, 3, 5], [2, 2, 2], [3, 9, 8]] 中经过max([1, 3, 5]), max([2, 2, 2]), max([3, 9, 8])后结果是True的项选出来,max([1, 3, 5]), max([2, 2, 2]), max([3, 9, 8])结果分别是5, 2, 9,都非0,都可判定是True,所以filter选出来的项分别就是[1, 3, 5], [2, 2, 2], [3, 9, 8],结果就是[[1, 3, 5], [2, 2, 2], [3, 9, 8]]
(我不理解你想达到什么目的)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-3-19 11:12:11 | 显示全部楼层
hrpzcf 发表于 2022-3-19 10:48
map和filter功能、如何传参你都没理解

功能:

特别感谢您,我一下子就明白了,我没有好好看速查宝典,不知道filter只接受两个参数,那么filter和pow永远无法兼容,因为pow至少要三个参数才可以,抱歉我有些钻牛角尖,刚开始学想什么东西都搞懂,细枝末节抓着不放,感谢前辈不厌其烦的帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-19 11:12:59 | 显示全部楼层
傻眼貓咪 发表于 2022-3-19 10:01
map()
有若干个元素,经过一个函数/方法,变成另外一个元素:
a, b, c -------> 函数 ---------> x, y, z ...

明白啦明白啦,感谢前辈指点,祝您万事顺意
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-19 11:17:29 From FishC Mobile | 显示全部楼层
李二蛋 发表于 2022-3-19 11:12
特别感谢您,我一下子就明白了,我没有好好看速查宝典,不知道filter只接受两个参数,那么filter和pow永 ...

内置的pow最少只需要2个参数,第三个是可选的
但是直接filter(pow, [...])的话filter会把[...]中的每一项传给pow,pow也只能接受到一个参数,这是不行的,想要实现也很简单,对pow进行一层包装就可以了

待续...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-19 11:20:33 | 显示全部楼层
李二蛋 发表于 2022-3-19 11:12
特别感谢您,我一下子就明白了,我没有好好看速查宝典,不知道filter只接受两个参数,那么filter和pow永 ...

def my_pow(x):
    return pow(*x)

print(list(filter(my_pow, [[2, 3], [3, 2], [10, 2]]))) # 没意义
print(list(map(my_pow, [[2, 3], [3, 2], [10, 2]])))

# 结果:
# [[2, 3], [3, 2], [10, 2]]
# [8, 9, 100]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-19 19:58:08 | 显示全部楼层

return pow(*x)
前辈这段代码是什么意思吖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-19 20:13:44 From FishC Mobile | 显示全部楼层
李二蛋 发表于 2022-3-19 19:58
return pow(*x)
前辈这段代码是什么意思吖

调用函数时,参数前面加星号是解包的意思,要求参数是元组或者列表之类的才能解包。定义函数时形参前面的星号是打包参数的意思。
比如x是[3, 2],直接pow(x)【即pow([3, 2])】肯定是不行的,pow不接受列表参数,需要把列表解包,pow(*x)【即pow(3, 2)】
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-20 14:44:33 | 显示全部楼层
hrpzcf 发表于 2022-3-19 20:13
调用函数时,参数前面加星号是解包的意思,要求参数是元组或者列表之类的才能解包。定义函数时形参前面的 ...

明白了明白啦,喜喜,感谢前辈咯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-20 14:51:59 | 显示全部楼层
hrpzcf 发表于 2022-3-19 20:13
调用函数时,参数前面加星号是解包的意思,要求参数是元组或者列表之类的才能解包。定义函数时形参前面的 ...

>>> list(map(lambda x:pow(*x), [[2, 3], [3, 2], [10, 2]]))
[8, 9, 100]
前辈您看我这样写行么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-20 16:04:15 From FishC Mobile | 显示全部楼层
李二蛋 发表于 2022-3-20 14:51
>>> list(map(lambda x:pow(*x), [[2, 3], [3, 2], [10, 2]]))
[8, 9, 100]
前辈您看我这样写行么

可以,匿名函数写法,函数简短的时候这么写更方便
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-3-21 15:03:52 | 显示全部楼层
hrpzcf 发表于 2022-3-20 16:04
可以,匿名函数写法,函数简短的时候这么写更方便

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-11 23:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表