lambda 过滤器如何应用于序列?

问题描述 投票:0回答:4

我正在尝试理解 Python 中的 lambda 过滤器。我很难理解的是 lambda 过滤器中

in x, people
子句的用法。我将过滤器的目的理解为:返回序列(人)中条件“高度”为 TRUE 的那些值。因此,我最初以为它会是
lambda x: "height" in people
。为什么是
x, people
?我的思维错误是什么?

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)
python lambda
4个回答
1
投票

内联 lambda 可能有点令人困惑。为了更好地理解它们,您首先需要了解 lambda 是什么:它们只是函数。

你也可以这样编写代码:

def getHeightValue (x):
    return x['height']

def containsHeight (x):
    return 'height' in x

heights = map(getHeightValue, filter(containsHeight, people))

如您所见,

, people
部分不是 lambda 的一部分,而是
filter
调用的一部分。
filter(function, iterable)
只是过滤
iterable
中那些
x
function(x)
返回 true 的元素。

从上面的代码中,您可以将这些短函数转换为 lambda:

getHeightValue = lambda x: x['height']
containsHeight = lambda x: 'height' in x

heights = map(getHeightValue, filter(containsHeight, people))

这基本上是一样的事情。*

并且由于您不需要将这些函数存储在变量中,因此您可以将它们内联到

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]

* 唯一的区别是 lambda 函数是无名的(“匿名”)。 不建议将其用于生产代码


1
投票

我认为一个变量名称的更改应该足以解释它:

filter(lambda person: 'height' in person, people)

您正在检查每个是否有身高。你不会检查“人是否有身高”,因为那没有意义。

people
是一个集合,并且只有该集合的元素可以有高度,而不是集合本身。

这是等效的行:

(person for person in people if 'height' in person)

0
投票

没有

in x, people
但是
(lambda x: 'height' in x), people
-
filter(first_argument_lambda_function, second_argument_people_list)


-1
投票

问题:python - lambda 过滤器

🧸💬 这是对问题的回复,简化功能,map 函数与 apply 函数类似,因为我们需要创建一个列表,而不是直接乘以目标列表或数字。我提供了两种方法来解释函数的相似性。

  1. 带有条件的 Lambda 函数。
  2. 具有相似流程的自定义函数。

示例代码

people = [{'name': 'Mary', 'height': 160},
          {'name': 'Isla', 'height': 80},
          {'name': 'Sam'}]
         

## First method using lambda function   
heights = map(lambda x: x["height"] if "height" in x.keys() else 0, people);
heights = list(heights);

print(heights)
print("*********************************************");

## Second method using a custom function
def custom_iterations( x ):
    try:
        return x["height"];
    except:
        return "0";

heights = map(lambda x: custom_iterations( x ), people);
heights = list(heights);

print(heights)

截图

Screenshot

© www.soinside.com 2019 - 2024. All rights reserved.