试图理解lambda

问题描述

| 当我做
dict = {\'Alice\': \'7898\',\'Beth\': \'9102\',\'Cecil\': \'3258\'}
print filter(lambda x: x,dict[\'Alice\'])
显示:7898 当我做下一个
dict = {\'Alice\': \'2341\',\'Cecil\': \'3258\'}
print filter(lambda x: x==\"2341\",dict[\'Alice\'])
表明: 为什么它不显示True。如何获得True?     

解决方法

        在我看来,您的误解与with2有关。您将谓词函数和可迭代对象传递给
filter
。它创建一个包含第一个可迭代项的新对象,谓词为其返回一个真值(本身不一定是“ 4”,只是测试为真的东西)。在这两种情况下,可迭代的字符串是“ 5”,这意味着要测试各个字母。当然字符串ѭ5not不等于
\'2\'
,\'
3\'
\'4\'
\'1\'
中的任何一个。 使用元组进行尝试,可以更轻松地了解发生了什么:
>>> tup = tuple(dict[\'Alice\'])
>>> tup
(\'7\',\'8\',\'9\',\'8\')
>>> filter(lambda x: x,tup)
(\'7\',\'8\')
>>> tup
(\'7\',\'8\')
>>> filter(lambda x: x==\"2341\",tup)
()
    ,        filter()执行以下操作:给定一个函数和一个可迭代对象(如列表,元组等),将列表中的每个项目传递给一个函数。对于每个项目,该函数返回布尔值true或false。如果函数对某个项目返回true,则该项目将添加到新列表中。 过滤器完成后,它将返回带有所有选定项目的新列表。这使您可以根据条件“通过列表筛选”,并仅选择与条件匹配的项目。 这里发生了一件棘手的事情。 filter()遍历所有可迭代对象。这包括一个字符串。当您将dict [\'Alice \']作为要迭代的对象时,它会传递\'2341 \',并在字符串中的每个字符上运行过滤器。您可以按以下方式分解过滤器的逻辑:
def matches(x):
    return x == \'2341\'

result = \'\'
for char in x:
    if matches(char):
         result += char

print result
这不起作用,因为您的单个字符都不等于\'2341 \'。     ,        您是否要测试\'Alice \'的条目是否为\'2341 \'。您可以通过
print dict[\'Alice\'] == \'2341\'
您面临的问题不是lambda形式,而是方法
filter
,这在此用例中不合适。 通常,lambda形式除了匿名函数外几乎没有什么(请参见此处)。     ,        也许您想要做的是:
>>> dic = {\'Alice\': \'2341\',\'Beth\': \'9102\',\'Cecil\': \'3258\'}
>>> [i for i in dic if dic[i] == \'2341\']
[\'Alice\']
而且,如果您添加其他具有相同值的元素,则会在列表中获得所有     ,        如果只想调用lambda函数,则可以像使用函数一样使用它:
print (lambda x: x==\"2341\")(dict[\"Alice\"])
这给出了预期的结果(正确)。 当您使用
filter
时,它将第二个参数视为一个列表,因此\“ 2341 \”被视为一个字符
[\'2\',\'3\',\'4\',\'1\']
的列表,两个字符都不等于\“ 2341 \”。 我刚刚发现的有趣的事情:Python 3从
filter()
函数返回过滤器对象,因此正确使用过滤器成为
print( list( filter( lambda x: x,dict[\'Alice\'] ) ) )
然后返回
[\'2\',\'1\']
,这样可以避免最初的混乱。     ,        通常,将ѭ2应用于两个参数: 一个功能 列表(或其他可迭代对象)
filter
将函数应用于列表中的每个对象,并返回函数返回returned4ѭ的所有对象的列表。 在第二个示例中,您的第一个参数是预期的函数。但是您的第二个参数不是列表,而是一个字符串\“ 2341 \”(在字典中查找\“ Alice \”的结果)。 (编辑:我最初弄错了下一部分。感谢其他发布者的正确介绍。)Filter将字符串像一个列表一样对待,将函数应用于每个字符并仅保留为其返回
True
的那些字符(都不存在) ,结果为空字符串。现在,如果您回顾第一个示例,它会遇到同样的问题,并且很幸运(不好?)答案是您所期望的。 正如另一个建议者所说,也许您想更直接地应用您的功能。在第一个示例中:
(lambda x: x)(dict[\'Alice\'])
在第二个示例中:
(lambda x: x==\"2341\")(dict[\'Alice\'])