问题描述
|
当我做
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\'])