【问题标题】:python split without creating blankspython拆分而不创建空白
【发布时间】:2013-07-09 07:10:48
【问题描述】:

感谢this question,我明白为什么使用拆分创建空白很重要,但有时不必抓住它们。

假设您解析了一些 css 并得到了以下字符串:

s1 = 'background-color:#000;color:#fff;border:1px #ccc dotted;'
s2 = 'color:#000;background-color:#fff;border:1px #333 dotted'

即使字符串末尾缺少分号,两者都是有效的 css。拆分字符串时,您会得到以下信息:

>>> s1.split(';')
['background-color:#000', 'color:#fff', 'border:1px #ccc dotted', '']
>>> s2.split(';')
['color:#000', 'background-color:#fff', 'border:1px #333 dotted']

多余的分号会在列表中创建一个空白项。现在,如果我想进一步操作,我需要测试每个列表的开头和结尾,如果它们为空白,则将其删除,这还不错,但似乎可以避免。

问题:

是否有与split 基本相同但不包括尾随空白项的方法?或者是否有一种简单的方法来删除那些就像一个字符串有strip 来删除尾随空格

【问题讨论】:

    标签: python string split


    【解决方案1】:

    只需使用 None 过滤器删除项目:

    filter(None, s1.split(';'))
    

    演示:

    >>> s1 = 'background-color:#000;color:#fff;border:1px #ccc dotted;'
    >>> filter(None, s1.split(';'))
    ['background-color:#000', 'color:#fff', 'border:1px #ccc dotted']
    

    None 调用filter() 会删除所有“空”或数字0 项目;在布尔上下文中会评估为 false 的任何内容。

    filter(None, ....) 早餐吃列表推导:

    >>> import timeit
    >>> timeit.timeit('filter(None, a)', "a = [1, 2, 3, None, 4, 'five', ''] * 100")
    9.410392045974731
    >>> timeit.timeit('[i for i in a if i]', "a = [1, 2, 3, None, 4, 'five', ''] * 100")
    44.9318630695343
    

    【讨论】:

    • 过滤器不比列表理解慢吗? (我不是说我的答案比你的好,我只是想知道)
    • 虽然所有答案都有效,但这个答案是真正回答我的问题的答案,而不是简单地使它适合我的情况。谢谢。我现在要睡觉了,但我会在早上接受答案
    • @Haidro: filter()None一个 C 操作,没有 Python 循环完成。我会说它更快。 :-)
    • 我不确定性能,但 GvR 正在考虑摆脱它,以及其他 lispy 内置插件,如 mapreduce。在 Python 3 中,reduce 被移至 functools 模块。我喜欢 lispies,但它不是惯用的 Python。
    • @PauloScardine 前几天有人把这个链接给我:artima.com/weblogs/viewpost.jsp?thread=98196
    【解决方案2】:

    您可以使用列表推导过滤掉空字符串,因为空字符串被视为False

    >>> s1 = 'background-color:#000;color:#fff;border:1px #ccc dotted;'
    >>> [i for i in s1.split(';') if i]
    ['background-color:#000', 'color:#fff', 'border:1px #ccc dotted']
    

    或者,您可以先rstrip() 分号:

    >>> s1.rstrip(';').split(';')
    ['background-color:#000', 'color:#fff', 'border:1px #ccc dotted']
    

    【讨论】:

      【解决方案3】:

      在执行split 之前将str.strip 应用于字符串:

      >>> s1 = 'background-color:#000;color:#fff;border:1px #ccc dotted;'
      ...     
      >>> s1.strip(';').split(';')
      ['background-color:#000', 'color:#fff', 'border:1px #ccc dotted']
      

      适用于前导和尾随';'

      >>> s1 = ';background-color:#000;color:#fff;border:1px #ccc dotted;'
      >>> s1.strip(';').split(';')
      ['background-color:#000', 'color:#fff', 'border:1px #ccc dotted']
      

      我不知道你为什么要在 split 比 LCfilter 更快之前避免这种情况:

      >>> s1 = ';background-color:#000;color:#fff;border:1px #ccc dotted;'*1000
      >>> %timeit filter(None, s1.split(';'))
      1000 loops, best of 3: 638 us per loop
      >>> %timeit s1.strip(';').split(';')
      1000 loops, best of 3: 570 us per loop
      >>> %timeit [i for i in s1.split(';') if i]
      100 loops, best of 3: 931 us per loop
      

      【讨论】:

        猜你喜欢
        • 2019-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多