Python的sort函数与Linux的LC_ALL = C排序相同

时间:2012-01-08 10:32:42

标签: python linux sorting

我正在将一个Bash脚本移植到Python。该脚本设置LC_ALL=C并使用Linux sort命令确保本机字节顺序而不是特定于语言环境的排序顺序(http://stackoverflow.com/questions/28881/why-doesnt-sort-sort-the-same-on-every-machine)。

在Python中,我想使用Python的列表sort()sorted()函数(没有key=选项)。我是否总能得到与LC_ALL=C的Linux排序相同的结果?

4 个答案:

答案 0 :(得分:8)

如果将locale.strcoll作为cmp参数传递给,则排序应该按预期运行 list.sort()sorted()

import locale
locale.setlocale(locale.LC_ALL, "C")
yourList.sort(cmp=locale.strcoll)

答案 1 :(得分:1)

考虑到您可以添加比较功能,您可以确保排序等同于LC_ALL = C.但是,从文档看,如果所有字符都是7位,那么默认情况下它会以这种方式排序,否则使用特定于语言环境的排序。

如果您有8位或Unicode字符,那么特定于语言环境的排序很有意义。

答案 2 :(得分:1)

Python版本中小于3的非unicode字符串实际上是字节。 sort函数和方法不执行任何操作来强制使用语言环境(需要使用语言环境模块函数来显式地识别区域设置)。

unicode字符串和Python 3.x的所有字符串都不再是字节。 Python 3中有一个“字节”类型。

答案 3 :(得分:1)

我一直在使用International Components for UnicodePyICU绑定来使用sorted()和使用我自己的语言环境(我的情况下是加泰罗尼亚语)对事物进行排序。例如,按名称属性排序用户配置文件列表:

collator = PyICU.Collator.createInstance(PyICU.Locale('ca_ES.UTF-8'))
sorted(user_profiles, key=lambda x: x.name, cmp=collator.compare)