我试图理解Python中的lambda过滤器。我正在努力理解的是"在x,people"中的用法。 lambda过滤器中的子句。我把过滤器的目的看作:返回那些条件" height"在序列(人)中为TRUE。因此,我最初会认为它将是" lambda x:" height"在人们)。为什么是x,人?我的想法错误是什么?非常感谢提前!
people = [{'name': 'Mary', 'height': 160},
{'name': 'Isla', 'height': 80},
{'name': 'Sam'}]
heights = map(lambda x: x['height'],
filter(lambda x: 'height' in x, people))
print(heights) #(160,80)
答案 0 :(得分:1)
我认为一个变量名称更改应足以解释它:
filter(lambda person: 'height' in person, people)
您是否检查每个人该人是否有身高。你不会检查人们是否有高度",因为这没有意义。 people
是一个集合,只有该集合的元素可以有一个高度,而不是集合本身。
这是一个等效的行:
(person for person in people if 'height' in person)
答案 1 :(得分:0)
内联lambda可能有点令人困惑。为了更好地理解它们,首先需要了解lambda是什么:它们只是函数。
您也可以这样编写代码:
, people
正如您所看到的,filter
部分不是lambda的一部分,而是filter(function, iterable)
调用的一部分。 iterable
只会为x
返回true的元素function(x)
过滤getHeightValue = lambda x: x['height']
containsHeight = lambda x: 'height' in x
heights = map(getHeightValue, filter(containsHeight, people))
。
从上面的代码中,您可以将这些短函数转换为lambdas:
map
这实际上是一回事。
由于您不需要将这些函数存储在变量中,因此您可以将它们内联到filter
和map
调用中,这就是您的原始代码。
请注意,您可以在此处使用列表推导来使逻辑更加明显。列表推导允许您将filter
和[getHeightValue(x) for x in people if containsHeight(x)]
合并为一个语法。它基本上是这样的:
[x['height'] for x in people if 'height' in x]
当你再次内联这些函数时,你会得到这个仍然很可读的函数:
[person['height'] for person in people if 'height' in person]
...或者使用更好的变量名称:
static bool CheckLogin(string path, string username, string pwd)
{
return XDocument.Load(path).Root
.Elements("user")
.Any(x=>x.Element("username").Value==username && x.Element("password").Value==pwd);
}
答案 2 :(得分:0)
没有in x, people
但(lambda x: 'height' in x), people
- filter(first_argument_lambda_function, second_argument_people_list)