我正在浏览“Python中的文本处理”并尝试了它关于Schwartzian排序的example。在
我使用下面的结构作为示例数据,其中也包含空行。我按第五列对这些数据进行排序:
383230-49-78 110003406文本9562文本720文本867
335067-152-18 3100030“文本”2400“文本”2342“文本”696
136592 21 230 310003503年。文本'10368'文本'1838'文本'977
用于Schwartzian排序的代码:
for n in range(len(lines)): # Create the transform
lst = string.split(lines[n])
if len(lst) >= 4: # Tuple w/ sort info first
lines[n] = (lst[4], lines[n])
else: # Short lines to end
lines[n] = (['\377'], lines[n])
lines.sort() # Native sort
for n in range(len(lines)): # Restore original lines
lines[n] = lines[n][1]
open('tmp.schwartzian','w').writelines(lines)
我不明白作者是怎么想用这段代码把短行或空行放到文件末尾的。行在if-else结构之后排序,从而将空行提升到文件顶部。当然,短行与示例中实现的自定义sort(第四个单词函数)一样工作。在
这让我很烦,有什么想法吗?若我对这一点是正确的,那个么您如何确保短线实际上停留在文件的末尾?在
编辑:我注意到“\377”前后的方括号。这把sort()搞乱了,所以我去掉了那些括号,输出开始工作了。在
^{pr2}$我接受了nosklo的回答,因为他很好地澄清了“\377”的含义并改进了算法。也非常感谢其他答案!在
如果好奇的话,我使用了2MB的示例文件,在创建相同的输出文件时,自定义排序耗时0.95秒,使用Schwartzian排序耗时0.09秒。它起作用了!在
与这个问题没有直接关系,但是请注意,在python的最新版本中(我想是从2.3或2.4开始),转换和取消转换可以使用
sort()
或sorted()
的参数自动执行。例如:我不知道问题出在哪里,所以我试着用一般的方法来澄清。在
该算法通过获取第四个字段并将其放在行的前面来对行进行排序。然后内置的
sort()
将使用此字段进行排序。之后,原始行被恢复。在空行或少于5个字段属于此结构的
else
部分:它将一个
['\377']
添加到要排序的列表的第一个字段中。该算法这样做是希望“\377”(ascii表中的最后一个字符)将比第5个字段中找到的任何字符串都大。所以在进行排序时,原始行应该位于底部。在我希望这能澄清问题。如果没有,也许你应该说明你想知道什么。在
同一算法的更好的通用版本:
^{pr2}$您提供的算法与此算法等效。在
空行不能通过测试
因此它将使用['\377']作为其排序键,而不是数据的第5列,即
lst[4]
(lst[0]
是第一列)。在相关问题 更多 >
编程相关推荐