Unix排序 - 字符比较算法

时间:2017-05-22 12:02:48

标签: python sorting unix

我需要以一致的方式对文件进行排序,因为Python会这样做。

我有一些使用Unix sort程序排序的文件。在对这个文件进行排序之后,我编写了Python脚本来检查它是否正确排序:

with open('my_file_location') as f:
    last_l = next(f)
    for l in f:
        if last_l > l:
            print(last_l, l)
            break
        last_l = l

脚本无法提供以下条目:

('250,8\n', '25,1\n')

我使用排序工具进行了一些实验,以检查输出是否实际可重复且与Python比较算法不一致。最后,我发现了两个有趣的案例:

 $ echo -e "250,1\n25,8" | sort
250,1
25,8
 $ echo -e "250,\n25," | sort
25,
250,

为什么这两个电话给我两个不同的订单?我认为这有点奇怪,因为起始字符保持不变,只有结束变化。

我的文件非常庞大,对我来说最好留在我当前的排序文件中。如何在Python中应用相同的字符串比较?

如果无法快速实施此比较,或者可能存在其他问题,我如何再次使用sort对文件进行排序,但这次使用Pythonly正确的比较算法?

更新

下面的Python输出示例(与Unix sort工具的输出不一致):

>>> '250,1' > '25,8'
True
>>> '250,' > '25,'
True

与Unix sort工具相反,在Python中,两种比较都给出了相同的结果。

1 个答案:

答案 0 :(得分:1)

你可以确认语言环境是罪魁祸首:

import locale

locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
L = ['250,1', '25,8']
print(sorted(L, cmp=locale.strcoll))
#['250,1', '25,8']

locale.setlocale(locale.LC_ALL, 'C')
print(sorted(L, cmp=locale.strcoll))
#['25,8', '250,1']