|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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都能得到正确答案,这其中是啥原理?
这里你的代码和使用方法存在一些问题。首先,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() 函数。
|
|