2024-06-26 13:44:53 发布
网友
当我这么做的时候
dict = {'Alice': '7898', 'Beth': '9102', 'Cecil': '3258'} print filter(lambda x: x, dict['Alice'])
显示:7898
当我做下一个的时候
它显示:
为什么它不真实。如何实现?在
在我看来,你的误会是关于filter。将谓词函数和iterable对象传递给filter。它创建一个新对象,其中包含第一个iterable中的那些项,谓词返回一个真值(不一定是True本身,只是一些测试为true的东西)。这两种情况下的iterable是字符串'2341',这意味着测试单个字母。当然,字符串'2341'不等于'2'、3'、'4'或{}中的任何一个。在
filter
True
'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”。在
在我看来,你的误会是关于}中的任何一个。在
filter
。将谓词函数和iterable对象传递给filter
。它创建一个新对象,其中包含第一个iterable中的那些项,谓词返回一个真值(不一定是True
本身,只是一些测试为true的东西)。这两种情况下的iterable是字符串'2341'
,这意味着测试单个字母。当然,字符串'2341'
不等于'2'
、3'
、'4'
或{用元组进行尝试,可以更容易地看到发生了什么:
是否要测试“Alice”的条目是否为“2341”。你可以通过
您面临的问题不是lambda表单,而是方法
filter
,这在本用例中并不合适。在一般来说,lambda形式或多或少就是一个匿名函数(参见here)。在
filter()执行以下操作:给定一个函数和一个iterable(如list、tuple等),将列表中的每个项传递给一个函数。对于每个项,函数返回布尔值true或false。如果函数对某个项返回true,则该项将添加到新列表中。在
当过滤器完成时,它返回包含所有选定项的新列表。这允许您根据条件在列表中“过滤”,并仅选择与条件匹配的项。在
这里发生了一件棘手的事。filter()循环遍历任何iterable。这包括一个字符串。当您传递dict['Alice']作为要迭代的对象时,它将传递“2341”,并对字符串中的每个字符运行过滤器。您可以将过滤器的逻辑分解如下:
这不起作用,因为您的单个字符都不等于“2341”。在
相关问题 更多 >
编程相关推荐