为什么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条件是必要的。是对的吗?
答案 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 ,那么有两个独立的函数,split
和splitfields
。我想这个名字解释了目的。第一个分裂在任何空格上,对任意文本输入有用,第二个在某些分隔输入上可预测。它们是在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中删除多余的空格,才能获得理想的结果。