为什么过滤功能在这种情况下不起作用?

时间:2020-07-08 06:31:13

标签: python list lambda filter

我已经编写了这段代码来删除字符串中的字符。我使用了过滤器功能,但是它返回了相同的列表而没有修改。

a = "Hello !!!!,  . / "
a1 = list(a)


def it(at):
    k = at.copy()
    charlist = [",", ".", "/", " ", ":", ";", "\'", "\"", "!"]
    for x in charlist:
        filter(lambda t: t != x, k)
    print(k)


it(a1)

I've referred to this answer on Stack Overflow

2 个答案:

答案 0 :(得分:3)

filter返回过滤的可迭代对象;它不会修改它。

>>> def it(at):
...     charlist = [",", ".", "/", " ", ":", ";", "\'", "\"", "!"]
...     print(list(filter(lambda t: t not in charlist, at)))
...
>>> it(a1)
['H', 'e', 'l', 'l', 'o']

一种更接近原始代码的实现方式是按照您的操作方式进行循环过滤,但是每次都重新分配k

>>> def it(at):
...     k = at.copy()
...     charlist = [",", ".", "/", " ", ":", ";", "\'", "\"", "!"]
...     for x in charlist:
...         k = list(filter(lambda t: t != x, k))
...     print(k)
...
>>> it(a1)
['H', 'e', 'l', 'l', 'o']

答案 1 :(得分:0)

Filter方法返回已被过滤的迭代器。 请参考下面的代码

a = "Hello !!!!,  . / "
a1 = list(a)


def it(at):
    k = at.copy()
    charlist = [",", ".", "/", " ", ":", ";", "\'", "\"", "!"]
    new_k = None
    for x in charlist:
        new_k = filter(lambda t: t != x, k)
    for s in new_k:
        print(s)


it(a1)