【问题标题】:Is Python's sort function the same as Linux's sort with LC_ALL=CPython的排序功能和Linux的排序一样吗 LC_ALL=C
【发布时间】:2012-02-05 07:15:24
【问题描述】:

我正在将 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= 选项)。我总是会得到与使用LC_ALL=C 进行 Linux 排序相同的结果吗?

【问题讨论】:

  • 哪个版本的 Python 和哪些项目要排序?

标签: python linux sorting


【解决方案1】:

如果您将 locale.strcoll 作为 cmp 参数传递给 list.sort()sorted():

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

【讨论】:

  • 谢谢大家。我的数据都是 Unicode,我说“没有 key= 选项”,因为我将它用于其他目的。这个解决方案效果很好。 @nabucosound,您的解决方案很有趣,但安装 PyICU 对我来说有点繁重。再次感谢。
【解决方案2】:

考虑到您可以添加一个比较函数,您可以确保排序将等同于 LC_ALL=C。但是,从文档看来,如果所有字符都是 7 位,则默认情况下以这种方式排序,否则使用特定于区域设置的排序。

如果您有 8 位或 Unicode 字符,那么特定于区域设置的排序很有意义。

【讨论】:

    【解决方案3】:

    小于 3 的 Python 版本中的非 unicode 字符串实际上是字节。 sort 函数和方法不执行任何强制语言环境的操作(需要语言环境模块函数来显式地促进语言环境感知排序)。

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

    【讨论】:

      【解决方案4】:

      我一直在使用 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多