我理解为什么使用拆分创建空白非常重要,感谢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
删除尾随空格
答案 0 :(得分:7)
只需使用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']
使用filter()
调用None
会删除所有'空'或数字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
答案 1 :(得分:6)
您可以使用列表推导来过滤掉空字符串,因为空字符串被视为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']
答案 2 :(得分:1)
在执行str.strip
之前将split
应用于字符串:
>>> 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']
我不确定为什么你会想要避免这种情况,因为拆分之前的速度会比LC
和filter
更快:
>>> 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