在Python中,当将空字符串分割时,为什么split()会返回一个空列表,而split('\n')会返回['']?
当在Python中拆分一个空字符串时,为什么split()返回一个空列表,而split('\n')却返回['']?
split()函数在没有参数的情况下会尝试智能地进行拆分。它会以任何空白字符、制表符、空格和换行符为分隔符,并且会跳过所有由此产生的空字符串。
例如:
>>> " fii fbar \n bopp ".split() ['fii', 'fbar', 'bopp']
实质上,没有参数的split()函数用于从字符串中提取单词,而带有参数的split()函数则只是将字符串按照指定的分隔符进行拆分。
这就是产生差异的原因。
另外,通过拆分来计算行数并不是一种高效的方法。可以通过计算换行符的数量,并在字符串结尾没有换行符的情况下加一来统计行数。
解决方法:
line_count = input_string.count('\n') if not input_string.endswith('\n'): line_count += 1
以上就是split()函数返回空列表而split('\n')返回['']的原因和解决方法。
在Python中,当使用split()函数对空字符串进行分割时,它返回的是一个空列表,而当使用split('\n')函数对空字符串进行分割时,它返回的是一个包含一个空字符串的列表['']。这个问题的出现是由于split()函数根据参数的有无选择了不同的分割算法。
根据官方文档的解释,当split()函数没有指定分隔符参数或者参数为None时,它使用一种不同的分割算法。连续的空白字符被视为一个分隔符,如果字符串开头或结尾有空格,则结果中不包含空字符串。因此,对于空字符串或只包含空白字符的字符串使用None作为分隔符的情况下,split()函数返回的是一个空列表。
为了更清晰地理解,split()函数实现了两种不同的分割算法,并通过参数的有无来决定使用哪种算法。这可能是因为优化没有参数的算法比有参数的算法更容易。至于为什么选择这样的设计,我并不清楚。
解决这个问题的方法就是根据具体需求选择合适的分割函数。如果需要对空字符串进行分割并得到一个空列表,可以使用split()函数。如果需要对空字符串进行分割并得到包含一个空字符串的列表,可以使用split('\n')函数。
总结一下,split()函数在处理空字符串时返回的是一个空列表,而split('\n')函数返回的是一个包含一个空字符串的列表。这是由于split()函数根据参数的有无选择了不同的分割算法。选择合适的函数可以根据具体需求来决定。
当在Python中对空字符串进行拆分时,为什么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())
这种差异的第二种模式在分隔数据(如CSV)时非常有用,其中重复的逗号表示空字段。例如:
data = '''\
Guido,BDFL,,Amsterdam
Barry,FLUFL,,USA
Tim,,,USA
'''
for line in data.splitlines():
print(line.split(','))
注意,结果字段的数量比分隔符的数量多一个。想象一下切割绳子。如果你不切割,你只有一段。切一刀,得到两段。切两刀,得到三段。Python的str.split(delimiter)方法也是如此。
那么有没有更方便的方法来计算字符串中的行数?
是的,有几种简单的方法。一种方法使用str.count(),另一种方法使用str.splitlines()。除非最后一行缺少\n,否则这两种方法将得到相同的答案。如果最后一行缺少换行符,str.splitlines()方法将给出准确的答案。一种更快但也准确的技术是使用计数方法,然后根据最后的换行符进行修正:
data = '''\
Line 1
Line 2
Line 3
Line 4'''
data.count('\n') # 不准确
len(data.splitlines()) # 准确,但速度较慢
data.count('\n') + (not data.endswith('\n')) # 准确且快速
为什么两种完全不同的算法被塞进同一个函数中?
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(',')的代码时,人们倾向于正确地将这些语句解释为“将一行分割为字段”。
微软Excel的文本到列工具做出了类似的API选择,并将两种拆分算法合并到同一个工具中。人们似乎在心理上将字段拆分视为一个单一的概念,即使涉及多个算法。