鱼C论坛

 找回密码
 立即注册
查看: 1131|回复: 5

[已解决]map()函数和filter()函数迭代对象适用什么样的运算

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

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

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

x
0.
>>> # 下面代码相当于 [max(1, 2, 0), max(3, 2, 3), max(5, 2, 9)]
>>> list(map(max, [1, 3, 5], [2, 2, 2], [0, 3, 9, 8]))
[2, 3, 9]
为啥max可以这么相当于,而不是[max(1,3,5),max(2,2,2),max(0,3,9,8)]
1.
>>> mapped = map(ord, "FishC")
为什么相当于[ord('F'),ord('i'),ord('s'),ord('h'),ord('C')]就可以
为什么map(len,'sdda','sdd')仅适用于一个对象
2.
>>> list(map(sorted,[[1,3,2],[5,4,6],[8,7,9]]))
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
为什么是sorted([1,2,3]),不是sorted(1,5,8)

3.
>>> list(map(len,['123','ddd']))
[3, 3]
>>> list(map(sum,[[1,2,3],[4,5,6]]))
[6, 15]
>>> list(map(sum,[1,2,3],[4,5,6]))
Traceback (most recent call last):
  File "<pyshell#39>", line 1, in <module>
    list(map(sum,[1,2,3],[4,5,6]))
TypeError: 'int' object is not iterable
>>> list(map(sum,[[1,2,3]]))
[6]
为什么要加两层[[]],才可以
现在特别蒙的一个状态,可能没有说明白问题,总结就是map()和filter()匹配什么样的运算函数,和运算函数的匹配规则是什么,希望各位前辈指点迷津
最佳答案
2022-3-19 09:51:40
本帖最后由 傻眼貓咪 于 2022-3-19 09:55 编辑

大哥,filter 接受 2 个参数,而你的代码明显有 3、4、5 ...个参数。

第一个参数为函数/方法,用于返回布尔值才是真正有意义,而你用的是 max 或 pow 返回只要不是 0 就是 true,以你代码为例,基本全输出不变(无意义)

你的代码:list(filter(max, [1, 3, 5], [2, 2, 2], [3, 9, 8]))
正确写法:list(filter(max, ([1, 3, 5], [2, 2, 2], [3, 9, 8]))) 但无意义

** 我猜你想要的应该是 map() 而不是 filter()

你可以试试:list(filter(lambda x: all(i%2 for i in x), ([1, 3, 5], [2, 2, 2], [3, 9, 8])))
意思是只要数组里的全部元素都是奇数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-18 23:07:22 | 显示全部楼层
本帖最后由 ba21 于 2022-3-18 23:12 编辑

很容易理解的问题你把他复杂化了。

参数
function -- 函数
iterable -- 一个或多个序列 (你不懂什么是序列?那我用列表来形容就是 一个或多个列表

list(map(sorted,[[1,3,2],[5,4,6],[8,7,9]]))  # 1个列表
传入列表中的每个元素到参数:
shorted([1,3,2])
shorted([5,4,6])
shorted([8,7,9])

list(map(max, [1, 3, 5], [2, 2, 2], [0, 3, 9, 8]))  # 多个列表
传入多个列表中的每个元素到参数(也就是说多个列表的话从每个中1个1个的取):
max(1,2,0)
max(3,2,3)


仔细把函数用法看懂:
https://www.runoob.com/python/python-func-map.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-3-19 09:35:12 | 显示全部楼层
ba21 发表于 2022-3-18 23:07
很容易理解的问题你把他复杂化了。

参数

>>> 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 09:51:40 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻眼貓咪 于 2022-3-19 09:55 编辑

大哥,filter 接受 2 个参数,而你的代码明显有 3、4、5 ...个参数。

第一个参数为函数/方法,用于返回布尔值才是真正有意义,而你用的是 max 或 pow 返回只要不是 0 就是 true,以你代码为例,基本全输出不变(无意义)

你的代码:list(filter(max, [1, 3, 5], [2, 2, 2], [3, 9, 8]))
正确写法:list(filter(max, ([1, 3, 5], [2, 2, 2], [3, 9, 8]))) 但无意义

** 我猜你想要的应该是 map() 而不是 filter()

你可以试试:list(filter(lambda x: all(i%2 for i in x), ([1, 3, 5], [2, 2, 2], [3, 9, 8])))
意思是只要数组里的全部元素都是奇数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-3-19 11:15:04 | 显示全部楼层
ba21 发表于 2022-3-18 23:07
很容易理解的问题你把他复杂化了。

参数

感谢前辈提供的帮助,感谢前辈提供的网站,我会好好研究里面的含义,祝您万事顺意
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-19 11:15:40 | 显示全部楼层
傻眼貓咪 发表于 2022-3-19 09:51
大哥,filter 接受 2 个参数,而你的代码明显有 3、4、5 ...个参数。

第一个参数为函数/方法,用于返回 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 20:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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