如何在python 3中复制类似的行为,如python 2中所示

时间:2016-10-07 11:56:08

标签: python python-2.7 python-3.x

我已在python 2中完成此操作:

python 2:

garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX"

message = filter(lambda x: x != 'X', garbled)

print message

结果:

'I am another secret message!'

但在python 3

garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX"

message = list(filter(lambda x: x != 'X', garbled))

print(message)

`python 3:

的结果
['I', ' ', 'a', 'm', ' ', 'a', 'n', 'o', 't', 'h', 'e', 'r', ' ', 's', 'e', 'c', 'r', 'e', 't', ' ', 'm', 'e', 's', 's', 'a', 'g', 'e', '!']

我想知道是否有可能在python 3 python 2中获得与message变量without adding相同的结果{@ 1}}新行到python 3中的代码{ {1}}。我已经知道join function了,我想像the python 2 code中那样直截了当。

1 个答案:

答案 0 :(得分:2)

在python 3.X filter()中返回一个迭代器,当你将它转换为list时,你将得到一个你的角色列表。因此,您可以将迭代器传递给str.join()方法,以便将过滤后的结果连接在一起:

In [1]: garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX"

In [2]: message = ''.join(filter(lambda x: x != 'X', garbled))

In [3]: message
Out[3]: 'I am another secret message!'

但请注意,使用过滤器不是删除角色的正确方法,而是只需使用str.replace()

In [4]: garbled.replace('X', '')
Out[4]: 'I am another secret message!'

这就是str.replace更加pythonic的原因:

In [5]: %timeit''.join(filter(lambda x: x != 'X', garbled))
100000 loops, best of 3: 8.08 µs per loop

In [6]: %timeit garbled.replace('X', '')
1000000 loops, best of 3: 1.04 µs per loop