Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的lambda和filter_Python_Lambda_Filter - Fatal编程技术网

python中的lambda和filter

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 != "

我有下面的字符串,我想通过过滤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)