“Python文本处理”中的Schwartzian排序示例

2024-09-30 16:22:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在浏览“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秒。它起作用了!在


Tags: 文件数据代码in文本示例forlen
3条回答

与这个问题没有直接关系,但是请注意,在python的最新版本中(我想是从2.3或2.4开始),转换和取消转换可以使用sort()sorted()的参数自动执行。例如:

def key_func(line):
    lst = string.split(line)
    if len(lst) >= 4:             
        return lst[4]
    else:                        
        return '\377'

lines.sort(key=key_func)

我不知道问题出在哪里,所以我试着用一般的方法来澄清。在

该算法通过获取第四个字段并将其放在行的前面来对行进行排序。然后内置的sort()将使用此字段进行排序。之后,原始行被恢复。在

空行或少于5个字段属于此结构的else部分:

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])

它将一个['\377']添加到要排序的列表的第一个字段中。该算法这样做是希望“\377”(ascii表中的最后一个字符)将比第5个字段中找到的任何字符串都大。所以在进行排序时,原始行应该位于底部。在

我希望这能澄清问题。如果没有,也许你应该说明你想知道什么。在

同一算法的更好的通用版本:

^{pr2}$

您提供的算法与此算法等效。在

空行不能通过测试

if len(lst) >= 4:

因此它将使用['\377']作为其排序键,而不是数据的第5列,即lst[4]lst[0]是第一列)。在

相关问题 更多 >