我正在尝试理解 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)
内联 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 函数是无名的(“匿名”)。 不建议将其用于生产代码。
我认为一个变量名称的更改应该足以解释它:
filter(lambda person: 'height' in person, people)
您正在检查每个人是否有身高。你不会检查“人是否有身高”,因为那没有意义。
people
是一个集合,并且只有该集合的元素可以有高度,而不是集合本身。
这是等效的行:
(person for person in people if 'height' in person)
没有
in x, people
但是(lambda x: 'height' in x), people
- filter(first_argument_lambda_function, second_argument_people_list)
问题:python - lambda 过滤器
🧸💬 这是对问题的回复,简化功能,map 函数与 apply 函数类似,因为我们需要创建一个列表,而不是直接乘以目标列表或数字。我提供了两种方法来解释函数的相似性。
- 带有条件的 Lambda 函数。
- 具有相似流程的自定义函数。
示例代码
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)
截图