试着去理解lambd

2024-06-26 13:44:53 发布

您现在位置:Python中文网/ 问答频道 /正文

当我这么做的时候

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

显示:7898

当我做下一个的时候

^{pr2}$

它显示:

为什么它不真实。如何实现?在


Tags: lambdafilterdictprintalicepr2bethcecil
3条回答

在我看来,你的误会是关于filter。将谓词函数和iterable对象传递给filter。它创建一个新对象,其中包含第一个iterable中的那些项,谓词返回一个真值(不一定是True本身,只是一些测试为true的东西)。这两种情况下的iterable是字符串'2341',这意味着测试单个字母。当然,字符串'2341'不等于'2'3''4'或{}中的任何一个。在

用元组进行尝试,可以更容易地看到发生了什么:

>>> 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形式或多或少就是一个匿名函数(参见here)。在

filter()执行以下操作:给定一个函数和一个iterable(如list、tuple等),将列表中的每个项传递给一个函数。对于每个项,函数返回布尔值true或false。如果函数对某个项返回true,则该项将添加到新列表中。在

当过滤器完成时,它返回包含所有选定项的新列表。这允许您根据条件在列表中“过滤”,并仅选择与条件匹配的项。在

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

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

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

print result

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

相关问题 更多 >