在Python中分割一个空字符串时,为什么split()返回一个空列表,而split(’\n’)返回[”]?

问题:

我使用split('\n')在一个字符串中获取行,发现''.split()返回一个空列表[],而''.split('\n')返回['']。有什么具体的理由有这样的区别吗?
有没有更方便的方法来计算字符串中的行?

回答:

问题:我使用split(’\ n’)来获取一个字符串中的行,并发现’.split()返回空列表[],而’.split(’\ n’)返回[”] 。

str.split()方法有两种算法。如果没有给出任何参数,它就会分开反复运行的空格。但是,如果给出参数,则将其视为单个分隔符,而不重复运行。
在分割空字符串的情况下,第一个模式(无参数)将返回一个空列表,因为空格被占用,并且没有值放在结果列表中。
相反,第二种模式(具有参数\n)将产生第一个空字段。考虑如果你写了'\n'.split('\n'),你会得到两个字段(一个拆分,给你两个一半)。

问题:有什么具体的理由有这样的区别吗?

当数据在具有可变数量的空格的列中对齐时,此第一种模式很有用。例如:

>>> data = '''\
Shasta      California     14,200
McKinley    Alaska         20,300
Fuji        Japan          12,400
'''
>>> for line in data.splitlines():
        print line.split()

['Shasta', 'California', '14,200']
['McKinley', 'Alaska', '20,300']
['Fuji', 'Japan', '12,400']

第二种模式对于诸如CSV的分隔数据很有用,其中重复的逗号表示空字段。例如:

>>> data = '''\
Guido,BDFL,,Amsterdam
Barry,FLUFL,,USA
Tim,,,USA
'''
>>> for line in data.splitlines():
        print line.split(',')

['Guido', 'BDFL', '', 'Amsterdam']
['Barry', 'FLUFL', '', 'USA']
['Tim', '', '', 'USA']

注意,结果字段的数量大于分隔符的数量。想想剪一条绳子。如果你没有削减,你有一块。做一个切,给两件。做两个裁剪,给三件。
所以这是Python的str.split(delimiter)方法:

>>> ''.split(',')       # No cuts
['']
>>> ','.split(',')      # One cut
['', '']
>>> ',,'.split(',')     # Two cuts
['', '', '']

问题:是否有更方便的方法来计算字符串中的行?

是的,有几种简单的方法。一个使用str.count(),另一个使用str.splitlines()
除非最后一行缺少\n,否则这两种方式都会给出相同的答案。
如果最后的换行缺失,str.splitlines方法将给出准确的答案。
更准确的技术是使用计数方法,但是将其更正为最后的换行符:

>>> data = '''\
Line 1
Line 2
Line 3
Line 4'''

>>> data.count('\n')                               # Inaccurate
3
>>> len(data.splitlines())                         # Accurate, but slow
4
>>> data.count('\n') + (not data.endswith('\n'))   # Accurate and fast
4    

@Kaz的问题:为什么这两个不同的算法成为一个单一的功能?

str.split的签名大约有20岁,而那个时代的一些API是严格务实的。
虽然不完美,但方法签名也不是“可怕的”。
在大多数情况下,Guido的API设计选择经受了时间的考验。
目前的API不是没有优势。考虑字符串,如:

ps_aux_header  = "USER               PID  %CPU %MEM      VSZ"
patient_header = "name,age,height,weight"

当被要求将这些字符串分解成字段时,
人们倾向于使用相同的英语单词“split”来形容。
当被要求读取代码如fields = line.split()
fields = line.split(',')
人们倾向于正确地解释这些陈述
作为“将行分割成字段”。
Microsoft Excel的text-to-columns tool做出了类似的API选择
在同一工具中集成了两种分割算法。
人们似乎在精神上模仿现场分裂
作为一个概念,即使涉及多个算法。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: When splitting an empty string in Python, why does split() return an empty list while split(‘\n’) returns [”]?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

76 − 68 =