[英]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:
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.