繁体   English   中英

试图了解 lambda

[英]trying to understand lambda

当我做

dict = {'Alice': '7898', 'Beth': '9102', 'Cecil': '3258'}
print filter(lambda x: x, dict['Alice'])

它显示:7898

当我做下一个

dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
print filter(lambda x: x=="2341", dict['Alice'])

表明:

为什么它不显示True。 如何获得真实?

filter()执行以下操作:给定一个 function 和一个可迭代对象(如列表、元组等),将列表中的每个项目传递给 function。 对于每个项目,function 返回 boolean true 或 false。 如果 function 在某个项目上返回 true,则将该项目添加到新列表中。

过滤器完成后,它会返回包含所有选定项目的新列表。 这使您可以根据条件“过滤”列表,并且 select 仅匹配条件的项目。

这里正在发生一件棘手的事情。 filter()循环遍历任何可迭代对象。 这包括一个字符串。 当您将 dict['Alice'] 作为 object 进行迭代时,它会传递 '2341',并对字符串中的每个字符运行过滤器。 您可以将过滤器的逻辑分解如下:

def matches(x):
    return x == '2341'

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

print result

这不起作用,因为您的单个字符都不等于“2341”。

对我来说,您的误解似乎与filter有关。 您将谓词 function 和可迭代的 object 传递给filter 它创建一个新的 object ,其中包含谓词返回真值的第一个可迭代项(不一定是True本身,只是测试为真的东西)。 在这两种情况下,可迭代的是字符串'2341' ,这意味着测试单个字母。 当然,字符串'2341'不等于'2' 、 ' 3''4''1'中的任何一个。

尝试使用元组,更容易看到发生了什么:

>>> tup = tuple(dict['Alice'])
>>> tup
('7', '8', '9', '8')
>>> filter(lambda x: x, tup)
('7', '8', '9', '8')
>>> tup
('7', '8', '9', '8')
>>> filter(lambda x: x, tup)
('7', '8', '9', '8')
>>> filter(lambda x: x=="2341", tup)
()

您要测试“Alice”的条目是否为“2341”。 您可以通过

print dict['Alice'] == '2341'

您面临的问题不在于 lambda 表单,而是在此用例中不适合的方法filter

一般来说,lambda 形式或多或少只不过是匿名的 function(参见例如此处)。

也许你想要做的是:

>>> dic = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
>>> [i for i in dic if dic[i] == '2341']
['Alice']

如果您添加具有相同值的其他元素,您将在列表中获得所有

如果您只想调用 lambda function,您只需像 function 一样使用它:

print (lambda x: x=="2341")(dict["Alice"])

这给出了预期的结果(真)。

当您使用filter时,它会将其第二个参数视为一个列表,因此“2341”被视为一个字符列表['2', '3', '4', '1'] ,其中没有一个等于“2341” .

我刚刚发现的有趣的事情:Python 3 从filter() function 返回过滤器对象,所以正确使用过滤器就变成了

print( list( filter( lambda x: x, dict['Alice'] ) ) )

并且返回['2', '3', '4', '1']可以避免最初的混淆。

通常,将filter应用于两个 arguments:

  1. 一个 function
  2. 列表(或其他可迭代对象)

filter将 function 应用于列表中的每个 object 并返回 function 为其返回True的所有对象的列表。

在您的第二个示例中,您的第一个参数是 function,正如预期的那样。 但是你的第二个参数不是一个列表——它是一个字符串“2341”(在字典中查找“Alice”的结果)。

编辑:我最初弄错了下一部分。感谢其他海报的正确处理。)过滤器将字符串视为列表,将 function 应用于每个字符并仅保留返回True的那些字符(没有一个) ,导致一个空字符串。 现在,如果您回顾您的第一个示例,它也有同样的问题,而且答案是您所期望的只是(很糟糕?)运气。

正如另一张海报所建议的那样,也许您想更直接地应用您的 function。 在第一个示例中:

(lambda x: x)(dict['Alice'])

在第二个例子中:

(lambda x: x=="2341")(dict['Alice'])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM