2012-01-08 68 views
6

我將一個Bash腳本移植到Python。該腳本設置LC_ALL=C,並使用Linux排序命令來確保本地字節順序而不是特定於語言環境的排序順序(http://stackoverflow.com/questions/28881/why-doesnt-sort-sort-the-same-on-every-machine)。Python的排序函數與Linux的排序函數相同LC_ALL = C

在Python中,我想使用Python的列表sort()sorted()函數(沒有key=選項)。我會一直得到與Linux一樣的結果LC_ALL=C

+2

哪個版本的Python和哪些項目要排序? – 2012-01-08 10:37:10

回答

7

排序應該表現爲你想到,如果你通過locale.strcollcmp參數 list.sort()sorted()

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

謝謝大家。我的數據全是Unicode,我說「沒有key = option」,因爲我用它來達到另一個目的。這個解決方案很好。 @nabucosound,你的解決方案很有趣,但安裝PyICU對我的目的有點沉重。再次感謝。 – tahoar 2012-01-08 12:43:27

1

考慮到您可以添加一個比較函數,您可以確保該排序將等同於LC_ALL = C。但是,從文檔看,如果所有字符都是7位,那麼默認情況下以這種方式排序,否則就是使用特定於語言環境的排序。

如果您有8位或Unicode字符,那麼特定於語言環境的排序很有意義。

1

Python版本小於3的非Unicode字符串實際上是字節。排序函數和方法不會執行任何操作來強制執行語言環境(需要使用語言環境模塊函數來顯式地促進語言環境感知的排序)。

unicode字符串和Python 3.x的所有字符串不再有字節。有一個「字節」類型在Python 3

1

我一直在用International Components for Unicode,隨着PyICU綁定,sort()排序的東西,並使用我自己的區域設置(加泰羅尼亞語在我的情況)。例如,按名稱屬性排列用戶配置文件列表:

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