我split('\n')用来获取一个字符串中的行,发现''.split()返回一个空列表[],而''.split('\n')返回['']。这种差异有什么具体原因吗?
split('\n')
''.split()
[]
''.split('\n')
['']
有没有更方便的方法来计算字符串中的行数?
问题:我split('\n')用来获取一个字符串中的行,发现''.split()返回一个空列表[],而''.split('\n')返回['']。
该str.split()方法有两种算法。如果没有给出参数,它会在重复运行的空白处分裂。但是,如果给定参数,则将其视为单个分隔符,不会重复运行。
str.split()
在拆分空字符串的情况下,第一种模式(无参数)将返回一个空列表,因为空格被吃掉并且没有值可以放入结果列表中。
相反,第二种模式(带有诸如 的参数\n)将产生第一个空字段。考虑如果你写了'\n'.split('\n'),你会得到两个字段(一个拆分,给你两半)。
\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)方法也是如此:
str.split(delimiter)
>>> ''.split(',') # No cuts [''] >>> ','.split(',') # One cut ['', ''] >>> ',,'.split(',') # Two cuts ['', '', '']
问题:还有更方便的方法来计算字符串中的行数吗?
是的,有几个简单的方法。一种用途str.count(),另一种用途str.splitlines()。两种方式都会给出相同的答案,除非最后一行缺少\n. 如果缺少最后的换行符,该str.splitlines方法将给出准确的答案。一种更快且准确的技术使用 count 方法,但随后将其更正为最终换行符:
str.count()
str.splitlines()
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 的问题:为什么将两种截然不同的算法硬塞到一个函数中?
for 的签名str.split大约有 20 年的历史,那个时代的许多 API 都是严格实用的。虽然不完美,但方法签名也不是“可怕的”。在大多数情况下,Guido 的 API 设计选择经受住了时间的考验。
str.split
当前的 API 并非没有优势。考虑以下字符串:
ps_aux_header = 'USER PID %CPU %MEM VSZ' patient_header = 'name,age,height,weight'
当被要求将这些字符串分解为字段时,人们倾向于使用相同的英文单词“split”来描述两者。当被要求阅读诸如fields = line.split()or之类的代码时fields = line.split(','),人们倾向于将这些语句正确解释为“将一行拆分为多个字段”。
fields = line.split()
fields = line.split(',')
Microsoft Excel 的text-to-columns 工具做出了类似的 API 选择,并将两种拆分算法合并到同一个工具中。尽管涉及不止一种算法,但人们似乎在心理上将场分裂建模为一个单一的概念。