【问题标题】:Removing empty strings from a list in python从python中的列表中删除空字符串
【发布时间】:2014-02-21 21:43:15
【问题描述】:

我需要拆分一个字符串。我正在使用这个:

def ParseStringFile(string):
p = re.compile('\W+')
result = p.split(string)

但我有一个错误:我的结果有两个空字符串 (''),一个在 'Лев' 之前。我该如何摆脱它们?

【问题讨论】:

  • 没有。它工作正常。空字符串是由于字符串开头多了一个新行。
  • nhahtdh 在使用 split 之前,我需要删除列表的第一个和最后一个空 (' ') 元素?

标签: python regex split


【解决方案1】:

正如 nhahtdh 指出的那样,空字符串是预期的,因为在字符串的开头和结尾都有一个 \n,但如果它们打扰你,你可以非常快速有效地 filter 他们。

>>> filter(None, ['', 'text', 'more text', ''])
['text', 'more text']

【讨论】:

    【解决方案2】:

    您可以在匹配之前从字符串中删除所有换行符:

    p.split(string.strip('\n'))
    

    或者,拆分字符串,然后删除第一个和最后一个元素:

    result = p.split(string)[1:-1]
    

    [1:-1] 获取结果的副本并包括从 1 开始(即删除第一个元素)到 -2 结束(即倒数第二个元素。第二个索引是独占的)的所有索引

    一个更长且不太优雅的替代方法是就地修改列表:

    result = p.split(string)
    del result[-1]   # remove last element
    del result[0]    # remove first element
    

    请注意,在这两种解决方案中,第一个和最后一个元素必须为空字符串。如果有时输入在开头或结尾不包含这些空字符串,那么它们将行为不端。然而,它们也是最快的解决方案。

    如果您想删除结果中的所有个空字符串,即使它们出现在结果列表中,您也可以使用列表理解:

    [word for word in p.split(string) if word]
    

    【讨论】:

    • filter 实际上击败了列表组合的少数实例之一。 stackoverflow.com/questions/3845423/…
    • @SlaterTyranus 我怀疑在这种情况下速度很重要,但可读性确实如此,我更喜欢列表理解。同样在 python3 filter 中不会产生一个列表,这可能是也可能不是 OP 想要的。此外,如果速度很重要,使用 [1:-1] 会快得多,因为它完全避免了所有真值测试。
    • 有道理,只是觉得你可能想知道。作为一个通常认为filtermap之类的东西应该很少使用的人,这是我真正需要为filter解决方案争论的一种情况。速度提高了 5 倍,并且直观地说,您正在过滤列表,但两者肯定都是准确的解决方案。 [1:-1] 对我来说似乎很脆弱。
    • @SlaterTyranus 这个答案来自 2010 年。在我的机器上,我得到了完全不同的结果,尽管 filterNone (显然)仍然是最快的(在 python2 上大约是 2.8 倍,大约是 85 % 在 python3 上)。在过去的 4 年中,似乎在优化解释器方面做得很好。
    • 过滤解决方案的速度如何?我不想使用 [1;-1] 解决方案,因为文本不必有“”符号,所有网站都不同
    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2018-08-10
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    相关资源
    最近更新 更多