python中的lambda和filter
我有下面的字符串,我想通过过滤X来解码python中的lambda和filter,python,lambda,filter,Python,Lambda,Filter,我有下面的字符串,我想通过过滤X来解码 garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX" 我想过滤。我尝试了以下代码 message = filter(lambda x: garbled.remove(x) if x == "X", garbled) 我没有让这条路起作用。我找到了另一个解决方案: message = filter(lambda x: x != "
garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX"
我想过滤。我尝试了以下代码
message = filter(lambda x: garbled.remove(x) if x == "X", garbled)
我没有让这条路起作用。我找到了另一个解决方案:
message = filter(lambda x: x != "X", garbled)
但我仍然想知道为什么第一个不起作用。我能修一下吗
(我是python新手)谢谢 您可以使用生成器表达式而不是
过滤器
>>> ''.join(i for i in garbled if i != 'X')
'I am another secret message!'
如果要使用过滤器
,则必须将lambda
更改为
>>> ''.join(filter(lambda x: x != 'X', garbled))
'I am another secret message!'
Cory已经修复了您的
过滤器
在我看来,您的问题最好通过简单的str.replace
来解决
>>> garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX"
>>> garbled.replace('X', '')
'I am another secret message!'
garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX"
f = lambda x: "" if x in "X" else x
message = filter(f, garbled)
"".join(message)
此代码无效,因为lambda函数必须是表达式
garbled.remove(x) if x == "X"
这是一个语句,不是一个表达式。
如果x==“x”,我将删除它以生成有效的表达式
message = filter(lambda x: garbled.remove(x), garbled)
接下来,我发现错误“'str'对象没有'remove'属性”。
因为乱码的类型是字符串,并且字符串类型中并没有名为“remove”的属性。
要使用筛选函数,第一个参数必须是“谓词”函数(返回True或False),第二个参数必须是类似iterable的。OP的第二个解满足这个条件。第二个参数是可iterable的字符串(字符列表),第一个参数是谓词函数,它接受从第二个参数字符串提供的一个字符)过滤器(函数,可iterable)
执行以下过程:
iterable
中的元素(即第二个参数)函数
(即第二个参数),查看它是否返回true函数
返回true的元素,并返回这些元素的新列表看看在步骤2中如果你通过
lambda x:garbled会发生什么。如果x==“x”
函数的参数:filter()
会对自己说,“嗯,如果我设置x=“I”
则是乱码。如果x==“x”
为true,则删除(x)”。就像你在第二个参数中对着filter()
喊指令:“嘿,请删除所有“X”
s”。但那不是去那里的正确选择。要求非常精确:它必须是一个接受元素并返回真值或假值的函数。您可以这样做。你在lambda的情况下犯了一个错误。您甚至不需要string.replace()
因此,您只想删除所有'X'
s?字符串没有任何remove
方法,因为字符串是不可变的。您的第一次尝试没有成功,因为它试图调用一个不存在的方法。为什么不直接调用decoded=garbled.replace('X','')
?如果您想保留一个“X”
,会发生什么情况?因为您是Python新手,现在确实应该使用Python 3了。。。所有evidecne都指出您正在使用Python2…仅供参考,join
s对于列表更有效,即'.join([i for i in charbled if i!='X'])
但是我现在找不到帖子。@timgeb是真的,但大多数时候差异太小以至于无法注意到(尤其是像原始问题中那样小的字符串)。除非性能出现问题,否则它可能不值得视觉上的混乱。感谢您对remove()不能用于字符串类型的优雅解释。
garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX"
f = lambda x: "" if x in "X" else x
message = filter(f, garbled)
"".join(message)