为什么str.split()删除Noney项目而str.split('')没有?

时间:2017-02-14 01:44:02

标签: python string split kwargs

为什么str.split()删除Noney项目而str.split('')没有?

>>> s = 'this is   an   irritating string with  random spacing  .'
>>> s.strip().split(' ')
['this', 'is', '', '', 'an', '', '', 'irritating', 'string', 'with', '', 'random', 'spacing', '', '.']
>>> s.strip().split()
['this', 'is', 'an', 'irritating', 'string', 'with', 'random', 'spacing', '.']

根据docs

str.split(sep = None,maxsplit = -1)

  

如果给出了sep,则连续的分隔符不会组合在一起,并被视为划分空字符串(例如,' 1,,2' .split(',')返回[' 1','',' 2'])。 sep参数可以由多个字符组成(例如,' 1<><>>' .split('<>')返回[' 1',' 2',' 3'])。使用指定的分隔符拆分空字符串将返回['']。

     

如果未指定sep或为None,则应用不同的拆分算法:连续空格的运行被视为单个分隔符,如果字符串具有前导或尾随,则结果将在开头或结尾处不包含空字符串空白。因此,将空字符串或仅由空格组成的字符串拆分为无分隔符将返回[]。

所以要使用关键字参数sep=是以下删除Noney项的pythonic方法吗?

[w for w in s.strip().split(' ') if w]

如果它只是空格(\s\t\n),str.split()就足够了,但我们假设我们试图拆分另一个字符/子字符串,列表理解中的if条件是必要的。是对的吗?

3 个答案:

答案 0 :(得分:1)

如果您想要变钝,可以使用filter(None, x)删除虚假物品:

>>> list(filter(None, '1,2,,3,'.split(',')))
['1', '2', '3']

可能不那么Pythonic。特别是迭代这些项目可能更清楚:

for w in '1,2,,3,'.split(','):
    if w:
        …

这清楚表明您正在跳过空白项目,而不依赖于str.split有时会跳过空白项目这一事实。

我很快就会使用正则表达式,要么跳过分隔符的连续运行(但要注意结束):

>>> re.split(r',+', '1,2,,3,')
['1', '2', '3', '']

或找到所有不是分隔符的内容:

>>> re.findall(r'[^,]+', '1,2,,3,')
['1', '2', '3']

如果你想在Python的历史中找回 way ,那么有两个独立的函数,splitsplitfields。我想这个名字解释了目的。第一个分裂在任何空格上,对任意文本输入有用,第二个在某些分隔输入上可预测。它们是在v1.6之前用纯Python实现的。

答案 1 :(得分:0)

嗯,我想您可能只需要了解文档。在您的示例中,您几乎都在演示文档中提到的算法的差异。不使用[('1', 'One'), ('2', 'Two'), ('3', 'Three')]关键字参数或多或少就像使用sep然后丢弃空字符串一样。如果一行中有多个空格,算法会对这些空格进行拆分并找到sep=' '。因为您明确表示希望将所有内容按空格分割,所以将None转换为空字符串。在这种情况下,将None更改为空字符串是一种很好的做法,因为它可以避免更改函数的签名(或者换句话说函数返回的内容),在这种情况下,它会返回字符串列表。

下面显示了如何区分具有4个空格的空字符串...

None

对于您的问题,只需使用>>> empty = ' ' >>> s = 'this is an irritating string with random spacing .' >>> empty.split() [] >>> empty.split(' ') ['', '', '', ''] 而不使用split()参数

答案 2 :(得分:-1)

你的字符串 s ='这是一个带有随机间距的刺激性字符串。', 它包含多个空格,这就是 empty.split('')返回noney值的原因。

你必须从字符串s中删除多余的空格,才能获得理想的结果。