【问题标题】:Python filter a list, remove \'n' and empty stringPython过滤列表,删除\'n'和空字符串
【发布时间】:2019-02-17 01:56:47
【问题描述】:

我有一个列表,我尝试删除空字符串和 '\n'

re = ['\n', '\n', '0 / 6\n', '1 / 6\n', '2 / 6\n', '3 / 6\n', '4 / 6\n', '5 / 6\n', '6 / 6\n', '\n', 'mobile\n']

resul = map(str.rstrip, re)
print(list(resul))

str_list = filter(None, list(resul))
print(list(str_list))

输出:

['', '', '0 / 6', '1 / 6', '2 / 6', '3 / 6', '4 / 6', '5 / 6', '6 / 6', '', 'mobile']
[]

所以,第一个输出是正确的,我成功删除了\n,但是当我想删除空的strinf之后,列表是空的。

【问题讨论】:

  • res = list(filter(None, [x.strip('\n') for x in re])) 怎么样?
  • re = [x.replace("\n", "") for x in re if x.replace("\n", "") != ""]
  • @OmG 因为您使用的是 Python 2,其中 mapfilter 返回列表。 OP 正在使用 Python 3,其中 mapfilter 返回一个生成器

标签: python-3.x list dictionary filter


【解决方案1】:

你得到一个空列表只是因为你在调用filter()(为了打印它)之前将resul转换为一个列表,它消耗它(因为map()返回一个map对象,它是一个生成器蟒蛇3)。您实际上是在将一个空生成器传递给filter

如果您删除过早的转换到列表,您将获得预期的输出:

 re = ['\n', '\n', '0 / 6\n', '1 / 6\n', '2 / 6\n', '3 / 6\n', '4 / 6\n', '5 / 6\n', '6 / 6\n', '\n', 'mobile\n']

resul = map(str.rstrip, re)
str_list = filter(None, list(resul))
print(list(str_list))

# ['0 / 6', '1 / 6', '2 / 6', '3 / 6', '4 / 6', '5 / 6', '6 / 6', 'mobile']

【讨论】:

  • 完美,它有效,但我不明白为什么,它在列表中转换后返回一个空列表
  • @locklockM 因为您尝试将同一个生成器转换为列表两次。第一次消耗生成器。第二次将空生成器转换为空列表。
【解决方案2】:

从列表中取出所有非\n 值并通过列表理解删除\n

re = ['\n', '\n', '0 / 6\n', '1 / 6\n', '2 / 6\n', '3 / 6\n', '4 / 6\n', '5 / 6\n', '6 / 6\n', '\n', 'mobile\n']

print([x.replace('\n', '') for x in re if x != '\n'])
# ['0 / 6', '1 / 6', '2 / 6', '3 / 6', '4 / 6', '5 / 6', '6 / 6', 'mobile']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2022-11-03
    相关资源
    最近更新 更多