2

由于这个问题,我理解为什么使用 split 创建空白很重要,但有时不必抓住它们。

假设您解析了一些 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删除尾随空格一样

4

3 回答 3

13

只需使用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()withNone删除所有“空”或数字 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
于 2013-07-09T07:12:14.663 回答
7

您可以使用列表推导过滤掉空字符串,因为空字符串被认为是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']
于 2013-07-09T07:12:06.053 回答
3

在执行以下操作之前应用于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']

我不知道为什么你会想要在 split 之前避免这种情况,因为它会比两者都快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
于 2013-07-09T07:13:38.590 回答