【问题标题】:Why does the filter function not work in this case?为什么过滤功能在这种情况下不起作用?
【发布时间】:2020-07-08 14:43:24
【问题描述】:

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

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

【问题讨论】:

  • filter 不会修改您正在就地过滤的容器。它在该容器中的过滤元素上返回一个迭代器。

标签: python list lambda filter


【解决方案1】:

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']

【讨论】:

  • 如何使用切片而不是 for 循环来执行相同的操作?类似于:z = list(filter(lambda t: t != charlist[::], k))
  • 查看我的答案的第一部分,了解如何在没有 for 循环的情况下执行此操作(它不涉及切片)。
【解决方案2】:

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)

【讨论】:

  • 如何使用切片而不是 for 循环来执行相同的操作?类似于:z = list(filter(lambda t: t != charlist[::], k))
猜你喜欢
  • 1970-01-01
  • 2017-11-26
  • 2010-12-29
  • 1970-01-01
  • 2021-08-05
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多