Python的sort函数和Linux的sort LC_ALL=C一样吗
我正在把一个Bash脚本转换成Python。这个脚本设置了 LC_ALL=C
,并使用Linux的排序命令,这样可以确保按照原始的字节顺序进行排序,而不是根据地区的不同来排序(http://stackoverflow.com/questions/28881/why-doesnt-sort-sort-the-same-on-every-machine)。
在Python中,我想使用Python的列表 sort()
或 sorted()
函数(不使用 key=
选项)。这样做的话,我能否总是得到和Linux在 LC_ALL=C
下排序一样的结果呢?
5 个回答
1
如果你可以添加一个比较函数,那么你就可以确保排序的结果和LC_ALL=C是一样的。不过,从文档来看,如果所有字符都是7位的,那么默认情况下就会按照这种方式排序;如果有其他字符,就会使用特定地区的排序方式。
如果你有8位或Unicode字符,那么使用特定地区的排序方式就很有意义了。
1
在Python 3之前的版本中,非Unicode字符串实际上是字节。排序函数和方法并不会自动考虑地区设置(如果想要根据地区进行排序,需要使用locale模块的相关功能)。
而在Python 3.x中,Unicode字符串和所有字符串不再是字节。Python 3中有一个专门的“字节”类型。
10
如果你把 locale.strcoll 作为 cmp
参数传给 list.sort() 和 sorted(),那么排序的结果应该会符合你的预期:
import locale
locale.setlocale(locale.LC_ALL, "C")
yourList.sort(cmp=locale.strcoll)
但是在 Python 3 中(来自 这个回答):
import locale
from functools import cmp_to_key
locale.setlocale(locale.LC_ALL, "C")
yourList.sort(key=cmp_to_key(locale.strcoll))