鱼C论坛

 找回密码
 立即注册
查看: 2008|回复: 4

[已解决]python中filter函数的第二个参数问题

[复制链接]
发表于 2023-4-17 16:13:30 | 显示全部楼层 |阅读模式

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

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

x
power = {"吕布":999, "关羽":888, "刘备":666, "张飞":900, "赵云":789, "不二如是":999}
power1 = {"":900}
# 请 lambda 表达式和 filter() 函数配合,替换下面的代码
greater = []
#for k, v in power.items():
#    if v > 800:
#        greater.append((k,v))
# 请 lambda 表达式和 filter() 函数配合,替换下面的代码

func = lambda **kwargs : [greater.append((k,v)) for k, v in kwargs.items() if v > 800]
filter(func(**power), power)
filter(func(**power), power1)
print(greater)


[('吕布', 999), ('关羽', 888), ('张飞', 900), ('不二如是', 999)]


对于filter(func(**power), power)和filter(func(**power), power1)
有没有大佬能解释一下为什么filter的第二个参数不管用power还是power1都能得到正确答案,这其中是啥原理?
最佳答案
2023-4-17 16:27:51
这里你的代码和使用方法存在一些问题。首先,filter() 函数的用法不正确,filter() 函数的第一个参数应该是一个函数,这个函数接收一个参数,返回一个布尔值。而你的 func 函数是一个 lambda 表达式,它使用 **kwargs 接收关键字参数,这与 filter() 的要求不符。

更正后的代码如下:
power = {"吕布": 999, "关羽": 888, "刘备": 666, "张飞": 900, "赵云": 789, "不二如是": 999}
power1 = {"": 900}

greater = filter(lambda item: item[1] > 800, power.items())

print(list(greater))

这里,我们使用了 lambda item: item[1] > 800 作为 filter() 函数的第一个参数,然后将 power.items() 作为第二个参数。运行这段代码,输出结果为:
[('吕布', 999), ('关羽', 888), ('张飞', 900), ('不二如是', 999)]

至于你在原始代码中为什么得到了正确答案,这是因为 func(**power) 和 func(**power1) 这两个函数调用实际上已经对 greater 列表进行了修改。这个过程中,filter() 函数并没有起到任何作用。

当你运行 filter(func(**power), power) 和 filter(func(**power), power1) 时,你实际上是在运行 filter(None, power) 和 filter(None, power1),因为 func(**power) 和 func(**power1) 都没有返回值,所以它们的返回值都是 None。这里的 filter() 函数根本没有起到过滤作用,它只是返回了一个没有过滤的迭代器,所有的结果都已经在 func() 函数里得到。这也就是为什么你可以得到正确答案的原因。

简而言之,你的代码中 filter() 函数并没有正确地使用,而正确答案的生成完全是由 func() 函数实现的。所以,你需要按照上面提供的更正后的代码来使用 filter() 函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-17 16:16:19 | 显示全部楼层
filter() 函数的第二个参数接受一个可迭代对象,例如列表、元组或字典。当我们调用 filter(func(**power), power) 时,filter() 函数会可以接受 power 字典作为第二个参数。

在调用 func(**power) 之后,会返回一个空列表 [],这是因为 func() 函数没有显式返回值(即没有使用 return 语句),它所做的只是向 greater 列表中添加符合条件的键值对。因此,filter() 函数实际上是根据 greater 列表的内容来筛选字典 power 中的元素,并将符合条件的元素留下来。

因为 power1 字典也没有任何符合条件的元素,所以在调用 filter(func(**power), power1) 时,返回的结果将是一个空的 filter 对象。

总的来说,filter() 函数并不直接操作第二个参数,而是通过遍历第二个参数来判断第一个参数的哪些值需要保留下来。因此,传入的第二个参数是否能够正确工作取决于该参数是否是可迭代的,并且其元素是否与第一个参数匹配。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-4-17 16:27:51 | 显示全部楼层    本楼为最佳答案   
这里你的代码和使用方法存在一些问题。首先,filter() 函数的用法不正确,filter() 函数的第一个参数应该是一个函数,这个函数接收一个参数,返回一个布尔值。而你的 func 函数是一个 lambda 表达式,它使用 **kwargs 接收关键字参数,这与 filter() 的要求不符。

更正后的代码如下:
power = {"吕布": 999, "关羽": 888, "刘备": 666, "张飞": 900, "赵云": 789, "不二如是": 999}
power1 = {"": 900}

greater = filter(lambda item: item[1] > 800, power.items())

print(list(greater))

这里,我们使用了 lambda item: item[1] > 800 作为 filter() 函数的第一个参数,然后将 power.items() 作为第二个参数。运行这段代码,输出结果为:
[('吕布', 999), ('关羽', 888), ('张飞', 900), ('不二如是', 999)]

至于你在原始代码中为什么得到了正确答案,这是因为 func(**power) 和 func(**power1) 这两个函数调用实际上已经对 greater 列表进行了修改。这个过程中,filter() 函数并没有起到任何作用。

当你运行 filter(func(**power), power) 和 filter(func(**power), power1) 时,你实际上是在运行 filter(None, power) 和 filter(None, power1),因为 func(**power) 和 func(**power1) 都没有返回值,所以它们的返回值都是 None。这里的 filter() 函数根本没有起到过滤作用,它只是返回了一个没有过滤的迭代器,所有的结果都已经在 func() 函数里得到。这也就是为什么你可以得到正确答案的原因。

简而言之,你的代码中 filter() 函数并没有正确地使用,而正确答案的生成完全是由 func() 函数实现的。所以,你需要按照上面提供的更正后的代码来使用 filter() 函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-4-17 16:29:35 | 显示全部楼层
isdkz 发表于 2023-4-17 16:27
这里你的代码和使用方法存在一些问题。首先,filter() 函数的用法不正确,filter() 函数的第一个参数应该是 ...

ctrl+f5,我和小号(theebody1)都换头像了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-17 18:19:29 | 显示全部楼层
isdkz 发表于 2023-4-17 16:27
这里你的代码和使用方法存在一些问题。首先,filter() 函数的用法不正确,filter() 函数的第一个参数应该是 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 17:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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