python - lambda过滤器

时间:2015-11-15 21:35:19

标签: python lambda

我试图理解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)

3 个答案:

答案 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

这实际上是一回事。

由于您不需要将这些函数存储在变量中,因此您可以将它们内联到filtermap调用中,这就是您的原始代码。

请注意,您可以在此处使用列表推导来使逻辑更加明显。列表推导允许您将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)